Fix sync with signature-v4 on objects with '~' in name

The uri-encoding of object names as part of signature-v4 was causing
AWS S3 to throw this error on some object names:

  The request signature we calculated does not match the signature you
  provided. Check your key and signing method.

The root cause was calling urllib.quote_plus() on the object name,
without specifying that the tilde '~' character should not be
%-escaped, but allowed to pass straight through.

This patch adds '~' to the safe argument of quote_plus() in both
places it's called.
move fallback_to_signature_v2 and force_signature_v4 up

These flags were defined in S3Request, which works, but has the
unfortuante side-effect that each request of a multi-request operation
(think [sync] or any recursive operation) would repeat the "try v4,
fallback to v2" or "asked for v2, but endpoint requires upgrading to
v4"), essentially causing two operations (one failing, one succeeding)
for every desired operation.

By moving these flags up from S3Request into class S3, they are
retained across all actions, so if you've got it wrong, it is only
wrong for one request, then is correct for all future requests.