(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).
I prefer it the way it is currently, maybe we can get a third person to weigh in on this? I think that it makes sense to have the create-client functions in their corresponding namespaces (async and sync) and that makes it easier for the user. I also think a shared create-client function would get messy since the two request functions being called both take different numbers of parameters.