Simplify implementation with struct keys

This doesn't change the API of context at all, but it simplifies the implementation, by using a struct for keys into the data map that stores the context values, as demonstrated in [this blog post](http://blog.golang.org/2013/02/go-maps-in-action.html) (see the "Key types" section). The request and the context value compose a compound value to key into the map.

The downside is the potentially O(n) behavior to delete values from the data map.