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.