etcd/client: ensure response body is always closed

There was a race condition when cancelling a request since the actual
RoundTrip is performed in a goroutine, and the cancel is done
asynchronously. This reworks the goroutine to ensure that the Body is
closed whenever a non-nil response is retrieved from the RoundTrip. It
also introduces a transport interface to support testing of requestHTTP
and adds complete coverage of the function.