Avoid HEAD requests (in some cases)

The output of ListBucket provides an ETag:, which is the MD5 of the
object stored by S3. If this matches the content on-disk, we know
that nothing has changed, and we don't need to issue a HEAD request.

Unfortunately, gzipped content can change its encoding (different
versions of gzip, different timestamps stored in the gzip header), in
which case the ETag: will differ from the compressed content on-disk.
To handle this case, we compare against the uncompressed content's MD5,
stored earlier in the x-amz-meta-content-md5 header. Retrieving this
header requires a HEAD request.

Objects that changed compressed contents but did not change uncompressed
contents are not replaced, but strictly speaking they're not identical
either. Instead, they are ignored with the reason "alternate encoding".
Merge pull request #36 from willglynn/avoid_head_requests

Avoid HEAD requests