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.
it's like you're reverting it back to the way it was. So far I'm seeing this as a regression to work that was done weeks ago.

If the parent class has a `transport` attribute and it's passed on the super constuctor, then you wouldn't need to make this assignment.