Add some cache support

We buffer the PNG instead of streaming it to the client, so we can calculate and add ETag headers.

The ETag cache tries to avoid the process of fetching all of the data and rendering the tile. Instead we can see if the data has changed. We'll have to watch this under load and see how useful it is and what the right cache size is.

/cc @hampelm