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.
Ah... nice. Another piece that can be localized to the storage abstraction.