PeerConnection cleanup

### Motivation
Cleanup `PeerConnection`; make code simpler and more maintainable.

### Changelog
* Align `send` methods in `PeerConnection` and `CryptoPeerConnection`; drop `send_raw`.
* Disentangle `PeerConnection` from `transport.py`; make classes more amenable to testing.
* Remove excessive `try` blocks. Do not silence really bad errors.
* Use global `zmq.Context` and let it manage itself.
can all of the lines above be executed without expecting some sort of `IOException`?