(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).
Agree with @fpringvaldsen that the API is cleaner with a `create-client` function existing in each of the two namespaces.  I don't have a strong opinion about whether the implementation of those two functions should try to call some common function, but it does seem like that could end up being a bit messy for the reasons that he described.