Mime types

@drsnyder 
We currently serve generated thumbnails with the mime type of the original. This has two problems:
1. If the original mime type is busted, any thumbnail created from that image won't be rendered correctly
2. If the format of the image changes during thumbnail generation (format=webp, for example), the image will be served with the incorrect mime type

This PR addresses both of these issues. Serving originals with broken mime types still results in failed renders, though. This is because the s3 stream is partially consumed when figuring out the mime type, leaving whatever else needs to use the input stream without those initial bytes, and failing to render.
It seems like these behaviors should be encapsulated in `vignette.storage.local` or `vignette.storage.s3`. Now `vignette.storage.common` needs to know something about what is returned by each. The `S3ObjectInputStream` is also leaking into `vignette.storage.common`, `vignette.util.filesystem` and `vignette.util.byte_streams`. 

I think if we created something like the following:

```clojure
(defprotocol StorageObjectProtocol
   (transfer! [this destination])
   (file-stream [this])
   (content-length [this])
   (file-stream->bytes [this]))
```

Then have `local/get-object` and `s3/get-object` return objects satisfying this protocol. We could then encapsulate the `S3ObjectInputStream` usage to `storage.s3` and `create-storage-object` implementations would also be storage specific.

We probably also want to change the name of `ObjectStorageProtocol` to something like `ObjectStorageSystemProtocol` to make it clear that it's different from `StorageObjectProtocol`.

I think I was the one that created these multimethods that use `S3ObjectInputStream`. I think I considered creating something like `StorageObjectProtocol` but I don't recall why not. Maybe it seemed like it was too soon.

Thoughts?