The memory-part can easily be handled by MemoryStore. There's just 1 gotcha:
when an item is to be deleted (but not yet committed), it needs to be deleted
from the MemoryStore too, but we need to be able to make a distinction
between "this is deleted" and "this value is not known in this memory cache,
fall back to real cache".
This is where this class comes in to play: we'll add an additional "expired"
method, which allows BufferedStore to just expire the keys that are supposed
to be deleted (instead of deleting them) - then we can keep track of when
a key is just not known, or known-but-deleted (=expired)