implement similar lifecycle for socks sessions as for socks server

Similar ideas to:
https://github.com/uProxy/uproxy-networking/pull/137

A SOCKS session lives as long as its TCP connection and datachannel.
add a TODO: when we move to using the real peer-connection class (instead of uproxypeerconnection freedom interface), then we can pass the data channel to the session.start function and avoid the peer-connection or the tag ever being needed explicitly in the session. That's going to make things a lot better, both for testing and for code readability.