Add two fixes for retryable client and boost timeout deadline

1. When retrying a request that has a body, the first attempt would
possibly read some of the body and so the reader would not be at
the beginning. This resulted in requests being sent with an empty body.
To fix this, we now make a copy of the body and reset the reader on
every retry.

2. For an unknown reason, our deadline would cause a timeout without a
timeout error being returned. This resulted in an empty response body
despite the contentLength reporting bytes. We now check contentLength vs
the body length and treat a mismatch as a retryable error.

@vgarg 
I think we should indicate in the comment here that this is a temporary hack. Needs proper fix.