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.
I think we'd be better to stick with the convention of naming the fulfill promise for a promise named `once<PROMISENAME>` as `fulfill<PROMISENAME>`. Otherwise it makes you think something special is happening.  i.e. rename `initiateShutdown_` to `fulfillShutdown`

Also we should rename the `onceClosed` to `onceShutdown` to mirror your renaming of `close` to `shutdown`, and merge `onceStopping_` and `onceClosed` (there's only a reason for a `onceStopping` if that is public. If it's private it plays no useful role that I can see).