client: follow redirects

I don't really know what to call it either.

I decided to go with the wrapped interfaces approach as it cleanly decouples the 3 different things our clients need to do. Explicitly separating functionality like this forces us to implement each little module cleanly, and allows us to test a very small piece of functionality at a time.