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.
As you know, I would like to avoid the required book-keeping if at all possible :-)

Remembering that both SOCKS server and SOCKS session will only call `close` once on each object:
* So, peerconnection is nice. `peerconnection.close` is explicitly idempodent (see its comments). Datachannel closure is idempodent even though the interface doesn't explicitly state it.
* `tcp.ts` is less well defined. `Tcp.Server.close` is not idempodent and has no `isClosed`-type function. We may want to fix that. `Tcp.Connection.close` is logically idempodent but prints a warning if you attempt multiple closures. Gah.

I've updated the comments in the `closeResources_` methods and made a yucky fix for TCP connection closure.

Thoughts?