Cache searches based on last tree updated

A natural way to invalidate searches is to cache them as long as a tree
or plot haven't been updated. Here we simply use the most recent audit
id (hashed) to provide an etag for search data.

Whenever a plot or tree is added or updated, the etag will change and
the data will be reloaded.