SOCKS server life-cycle: detailed definitions and unit tests for onceStarted and onceStopped promises

The general idea here is that the SOCKS server depends on two things to function:

* TCP server
* peerconnection

Once both have successfully started, the SOCKS server is running (`onceStarted`); conversely, once _either_ dies, the SOCKS server has died (`onceStopped`).

This defines `onceStarted` and `onceStopped` reasonably concretely and adds unit tests for how they should behave. Those tests are obviously pretty abstract so this pull request has a number of TODOs marking where integration tests are required, e.g. verify peerconnection's `onceDisconnected` actually fires and that its `stop` method is idempodent.

Tested with the sample apps.

Clearly, a followup pull request would implement a similar lifecycle for SOCKS sessions which depend on both a TCP connection and data channel to function.
I think I prefer something like: 
```
tcpServer.listen();
this.onceReady = peerconnection.onceConnected().then(tcpServer.onceListening);
```

(The array-binding to first element via an any-type coercion trick to get the result of the tcpServer listen is tricky: it's easy to get that wrong and the compiler won't help you)

I've added `tcpServer.onceListening` so you can do this... see this branch:  https://github.com/uProxy/uproxy-networking/blob/iislucas-tcp/src/tcp/tcp.d.ts