Support query-string signing with custom headers

For simple presigned POSTs we could reasonably assume that a browser
wasn't going to send any interesting headers. In many other cases, this
assumption doesn't hold. For example - browser-based uploads via
PutObject where you want to set the Content-MD5 header, or a
Content-Type.

This PR allows you to pass a hash of headers to any of the methods on
`QueryStringSigner`, which will be included in the signing algorithm as
documented on the AWS site.