Cache static files by hash

Implements #2734.

Deployment note: `GRATIPAY_ASSET_URL` needs to be changed to `https://assets.gratipay.com/` on Heroku. I don't think we'll need to change anything on the CDN side, can you confirm that @whit537 ?
We don't want a 410 here. We're using the same etag value in the URL and the headers, but they're two different caching mechanisms. A client requesting `/assets/something` with a bad etag in the headers is okay, we just send the file and the correct etag. On the other hand requesting `/assets/something?etag=bad-hash` is not okay (it's really never supposed to happen), because it would be like sending a new version of a file while pretending that it's an old one.