(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).
@KevinCorcoran The big problem with doing that is the fact that that would cause name conflicts between the request functions from the protocol and the ones in the async namespace, so the protocol ones would get overwritten by the async namespace ones. The only way I can think of to get around this without putting create-client in its own namespace is to change the name of the protocol functions (like, for example, changing `get` to `get!` or something like that), which I can do if you'd like.