use an adapter class to avoid runtime checks

We can speed up cache get and set by using a proxy adapter object.  Then
we only have to check for `respond_to?` once (rather than every get / set)