Add Caching Support

This follows on from the discussion in #32.

I've started with ETags as an example implementation but would like to add LastModified before the changes are merged.