To be able to label incoming tor connections as different from normal localhost connections in e.g. `getpeerinfo` and the peers list in the GUI it'd be useful to have them connect on an alternative local-only port. Or even better, a UNIX socket.

For manually set-up hidden services this would have to be configured manually and could add a `hsport` option or such. The external port would still appear as `XXXXXXXXX.onion:8333`, however internally it would redirect to a that port.

In the case of `torcontrol` this would be easy to set up automatically. It could add a new (localhost) binding port automatically and this code would have to be changed:
- https://github.com/bitcoin/bitcoin/blob/master/src/torcontrol.cpp#L441
- https://github.com/bitcoin/bitcoin/blob/master/src/torcontrol.cpp#L477

pool GUARDED_BY(cs_tx_inventory){false};
        // 
        std::atomic<std::chrono::seconds> m_last_mempool_req{std::chrono::seconds{0}};
        std::chrono::microseconds nNextInvSend{0};
        RecursiveMutex cs_feeFilter;
        // 
        CAmount minFeeFilter GUARDED_BY(cs_feeFilter){0};
        CAmount lastSentFeeFilter{0};
        int64_t nextSendTimeFeeFilter{0};
    };
    // 
    std::unique_ptr<TxRelay> m_tx_relay;
    // 
    std::vector<uint256> vBlockHashesToAnnounce GUARDED_BY(cs_inventory);
    /** UNIX epoch time of the last block received from this peer that we had
     * not yet seen (e.g. not already received from another peer), that passed
     * preliminary validity checks and was saved to disk, even if we don't
     * connect the block or it eventually fails connection. Used as an inbound
     * peer eviction criterium in CConnman::AttemptToEvictConnection. */
    std::atomic<int64_t> nLastBlockTime{0};
    /** UNIX epoch time of the last transaction received from this peer that we
     * had not yet seen (e.g. not already received from another peer) and that
     * was accepted into our mempool. Used as an inbound peer eviction criterium
     * in CConnman::AttemptToEvictConnection. */
    std::atomic<int64_t> nLastTXTime{0};
    // 
    // 
    std::atomic<uint64_t> nPingNonceSent{0};
    /*
    std::atomic<std::chrono::microseconds> m_ping_start{std::chrono::microseconds{0}};
    // 
    std::atomic<int64_t> nPingUsecTime{0};
    // 
    std::atomic<int64_t> nMinPingUsecTime{std::numeric_limits<int64_t>::max()};
    // 
    std::atomic<bool> fPingQueued{false};
    std::set<uint256> orphan_work_set;
    CNode(NodeId id, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn, SOCKET hSocketIn, const CAddress &addrIn, uint64_t nKeyedNetGroupIn, uint64_t nLocalHostNonceIn, const CAddress &addrBindIn, const std::string &addrNameIn, ConnectionType conn_type_in);
    ~CNode();
    CNode(const CNode&) = delete;
    CNode& operator=(const CNode