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.
Not sure what I think of spying on internal values... I think we'd be better mocking the tcp and peer-connection for some realistic values and then test the specification in terms of our function call-interactions and IO. Unit tests for internal functions are of slightly dubious value in my mind... but I'm a little undecided and it's late... lets chat a bit tomorrow? Would love to know what you think. If something is so complex it needs to be tested independently, I'd be inclined to think about factoring it our into its own thing... thoughts?