New client proxy system. This replaces the async_* methods, and abstracts out
things like #respond_with.

Call semantics now look like:

  client.get(...).call -> Response

  client.async.get(...) -> Response (uncalled)
  client.async.get(...) -> Response (uncalled)
  client.execute! -> Call requests in parallel, blocking the calling thread

  client.background.get(...) -> Immediately call the request asynchronously, returns a Future

  client.respond_with(body: "stubbed body").get(...).call -> Response (stubbed)

Additionally, socket connection timeouts are now properly enforced.