Retry intermittent S3 download failures

This builds on the recent work in botocore
(https://github.com/boto/botocore/pull/210) to address two things:

* ensure than any .read() call used from the streaming response of
  `GetObject` will never hang.  We do this by applying a timeout
  to the underlying socket.
* Catch and retry IncompleteReadError. There may be times when we
  don't receive all of the contents from a `GetObject` request such
  that amount_read != content-length header.  Botocore now checks
  this and raises an exception, which the CLI now catches and retries.