If you #end a stream, assume you want subs to be cancelled too

The expectation, with duplex streams, is that `end`ing a stream will
provoke the other party to also end the stream.
Close things, and synchronise on doing so

Close channels (exchange, queues) when we're done with them, so as not
to leak queues. This requires a lot more synchronisation; in
particular:

 - when closing the context, make sure all sockets are closed first
 - when closing the channel, make sure all in-progress connects are
   done