(#1) Move cache eviction control to policy and strategy

Previously, the store was evicting everything on a full cache. Now the
policy is telling the strategy to evict everything. This allows for
easier custom cache eviction code.

This PR also includes a bunch of refactors needed to make this feature
happen, as well as the Lock, an occasional mutex (similar to a
read/write lock, with a different concept of read/write).

Also addressing race conditions that were discovered in the process (and
are covered by tests)