(TK-27) Allow user to manage clients explicitly

This PR will allow the user to explicitly create instances of a sync or async client, and then use those clients for multiple http requests. All the previous APIs remain intact; if the user uses the old http request functions, things will behave as they did before (i.e., it will create a new client and close it once the response comes in).
derp, I misread these tests; I see now, you're testing the protocol functions on the client directly.  So these tests are good.  I still think adding one where you try to make a request after you've closed the client would be good, and also, adding some tests where you call `request` directly and pass in the client.  My comments above should still hopefully be relevant for those tests that go directly through `request`?