Etag Caching Middleware

Created a middleware that does correct etag based caching so we can avoid
transmitting data the client already has.

Closes #59