Adds gzip compression option (with specs)

Implements the feature requested by #24 and quickly implemented in #25 with some structural improvements and test coverage.

Refactored out an `Upload` class from the uploader to handle conditional cases like `gzip` in a cleaner fashion.

This still hasn't solved the issue that the MD5 comparison fails for gzipped files and so they are always uploaded. I may take a look but wanted to get the pull request started.