Refactor presign logic into AWS.Signers.Presign

Also adds request.presign() operation, which works for any
SigV4 signed request. S3 operations should continue to use
s3.getSignedUrl() for presigned URLs.