Fix URI encoding in requests and signing, use Amazon method of URI encoding.

Signed URIs should be encoded exactly the same as URIs in HTTP request.

1. net/url methods for encoding do not match Amazon's methods of encoding, so we
need our own method to escape URIs.
2. url.URL has problems with handling of .Opaque (alreay encoded) paths:
  * when calling .String(), it assumes that .Opaque contains "//host" part
  * when calling .RequestURI(), it assumes that there's no "//host" part, only path.

The change with request.url(full bool) looks ugly, but I see no better way to handle that.

Sorry for making so many pull requests, but this version seems to handle all corner cases.