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 ?
This duplicates the check on line 14, above.  If you move this check after `etag` is set in line 31, you can instead change the condition to `if etag == ''`, or better yet change the retval of `asset_etag()` to `None` in the case of simplates and then the condition can be `if etag is None:`