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

stats.m_ping_usec = nPingUsecTime;
    stats.m_min_ping_usec  = nMinPingUsecTime;
    stats.m_ping_wait_usec = count_microseconds(ping_wait);
    
    CService addrLocalUnlocked = GetAddrLocal();
    stats.addrLocal = addrLocalUnlocked.IsValid() ? addrLocalUnlocked.ToString() : "";
    stats.m_conn_type_string = ConnectionTypeAsString();
}
#undef X
/**
 * Receive bytes from the buffer and deserialize them into messages.
 *
 * @param[in]   pch         A pointer to the raw data
 * @param[in]   nBytes      Size of the data
 * @param[out]  complete    Set True if at least one message has been
 *                          deserialized and is ready to be processed
 * @return  True if the peer should stay connected,
 *          False if the peer should be disconnected from.
 */
bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete)
{
    complete = false;
    const auto time = GetTime<std::chrono::microseconds>();
    LOCK(cs_vRecv);
    nLastRecv = std::chrono::duration_cast<std::chrono::seconds>(time).count();
    nRecvBytes += nBytes;
    while (nBytes > 0) {
        
        int handled = m_deserializer->Read(pch, nBytes);
        if (handled < 0) {