TLS Support

Connection instantiation is now synchronous, which necessitated lots of test changes. Many tests became integration tests. Others used better mocking. The big theme on that front is that the `FakeServerTest` is now gone because it was too difficult to maintain.
If the client requests TLS, but the server doesn't support it, I think we should refuse to connect. It would be unsafe if the client thought that its messages were going to be secured, but then got transmitted in clear text over the internet.