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

&) = delete;
private:
    const NodeId id;
    const uint64_t nLocalHostNonce;
    const ConnectionType m_conn_type;
    std::atomic<int> m_greatest_common_version{INIT_PROTO_VERSION};
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    const ServiceFlags nLocalServices;
    const int nMyStartingHeight;
    NetPermissionFlags m_permissionFlags{ PF_NONE };
    std::list<CNetMessage> vRecvMsg;  // 
    mutable RecursiveMutex cs_addrName;
    std::string addrName GUARDED_BY(cs_addrName);
    // 
    CService addrLocal GUARDED_BY(cs_addrLocal);
    mutable RecursiveMutex cs_addrLocal;
public:
    NodeId GetId() const {
        return id;
    }
    uint64_t GetLocalNonce() const {
        return nLocalHostNonce;
    }
    int GetMyStartingHeight() const {
        return nMyStartingHeight;
    }
    int GetRefCount() const
    {
        assert(nRefCount >= 0);
        return nRefCount;
    }
    bool ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete);
    void SetCommonVersion(int greatest_common_version)
    {
        m_greatest_common_version = greatest_common_version;
    }
    int GetCommonVersion() const
    {
        return m_greatest_common_version;
    }
    CService GetAddrLocal() const;
    //
    void SetAddrLocal(const CService& addrLocalIn);
    CNode* AddRef()
    {
        nRefCount++;
        return this;
    }
    void Release()
    {
        nRefCount--;
    }
    void AddAddressKnown(const CAddress& _addr)
    {
        assert(m_addr_known);
        m_addr_known->insert(_addr.GetKey());
    }
    void PushAddress(const CAddress& _addr, FastRandomContext &insecure_rand)
    {
        // 
        // 
        // 
        assert(m_addr_known);
        if (_addr.IsValid() && m_addr_known->contains(_addr.GetKey())) {
            if (vAddrToSend.size() >= MAX_ADDR_TO_SEND) {
                vAddrToSend[insecure_rand.randrange(vAddrToSend.size())] = _addr;
            } else {
         