Add first draft of caching layer

Probably should be pulled out into its own type, since we'll want the
same logic for caching Zipper.Find() results too.

Start of work for #1.