Cache search results via default fragment caching.

Includes:
* Deferring searches to run right before results are used.
* Create SearchesModels#cache_key off the params hash
* Cache searches based on the parameters it's run with