Enhance s3 request timeout support

ReadTimeout is now a per Read timeout instead of an overal request timeout
which is now provided by RequestTimeout.

Added additional timeout options:
* WriteTimeout which is a per Write request timeout.
* RequestTimeout which is the overall request attempt timeout.
* ConnectTimeout which is the request connection attempt timeout.

Document each timeout option.

Also change New to used named parameters to avoid issues when adding new
S3 struct options.

This changes
Enhance s3 attempt strategy retry logic

Windows uses different error Op values for net.OpError errors so
request retries where not happening for read, write and connection
attempt errors.

Errors returned when operating on a Request.Body are wrapped in
url.Error. Unwrap these errors so retry logic works the same for
errors that occur when processing Request.Body.
add account alias handling
Expose the attempt strategy used for s3 requests

The attempt strategy used by s3 requests can now be customised by
via S3.AttemptStrategy.

Export the default attempt strategy by New S3 objects as
DefaultAttemptStragety for user visability.
Ensure RequestTimeout cooperate with Read and Write timeouts

As Dailer SetDeadline is not seperate from net.Conn deadlines
ensure the two cooperate.

Also fix http connection reuse by storing client on the S3 object.
gofmt s3.go
Update s3 tests to use S3 object AttemptStrategy field
Cleanup SNS code

As per the (now-removed) message in sns.go.

I've separated this file into several different files:

* endpoint.go - Endpoint requests + their structs
* message.go - The Message struct, nothing else
* permissions.go - Permission requests + their structs
* platform.go - Platform + Platform application requests + their structs
* subscription.go - Subscription requests + their structs
* topic.go - Topic requests + their structs

This is a cherry pick of my mitchellh/goamz#f58cad4 commit. This commit has the more built-out changes from goamz, meshed with the organisational structure of the mitchellh commit.
Remove commented out debug code
Remove topic+message args from sns.query

This function never did anything with topic or message. Not only that, it was always called with the first two arguments of nil.
Remove sns.DeleteTopic

It doesn't make much sense for this function to be on sns, when you're passing in a topic object and then calling Delete on it anyway. If you have the topic object, just call
Drop sns.Message
Correct Topic.Delete() test

Topics need a related SNS field to know which endpoint to hit for the request.
Pass message around as a string, not an 8192-byte
Set Topic.SNS in sns.CreateTopic()

Conflicts:
	exp/sns/sns_test.go
Set Topic.SNS in sns.ListTopics

Conflicts:
	exp/sns/sns_test.go
Merge pull request #13 from radar/sns-cleanup

SNS cleanup
Merge pull request #6 from stengaard/master

Account alias added to IAM
Merge pull request #7 from multiplay/master

Enhance timeout support and expose attempt strategy to S3 consumers
Adding basic sts support