Allow idempotent request signing

This fixes a bug where request signing is not
idempotent.  This is because setting a header
value does not replace the old value, it actually
appends the new value to a list of values associated
with the header name.  This causes issue when the
same request is retried, particularly with S3 retries.

This fixes the signature errors we've been seeing in
the integration tests.

cc @kyleknap @danielgtaylor