sig: fix bad signature exception

Due to the previous change, a bad signature will raise a generic error
because `constant-string=` doesn't handle `nil`. We test if we have a
signature before checking the signature. If the signature is nil, the
appropriate error code is presented to the user.
request: log an exception when returning an error

Exception logging is only done at debug level. This helps understanding
why a user gets some error.
tests: add tests for request signatures

Test `io.pithos.sig.string-to-sign` function with various
cases. Currently, the test with `x-amz-date` and `Date` header is
failing but this is expected.
sig: fix signature when both `Date` and `x-amz-date` headers are present

When both headers are present, the `Date` header should be ignored and
the corresponding line in the signature should be empty. This
modification makes the appropriate test succeed.

We assume that when the `expires` query string is present, it overrides
the `Date` field even when `x-amz-date` is present. This is a corner
case not correctly specified in Amazon S3 documentation since most of
the time, the `x-amz-date` header won't be present.