Add support for write-before-read (set), and update-aware expiry

The change here boils down to storing the `Expiry` time (`LifeTime` + `TTL`) on the object in ETS, and then passing `Expiry` to the expirer, which then does a more discriminating flush.  At expiry, it will only delete the value from ETS if it hasn't since been updated.

These changes give us the following functionality:
- write-before-read (the ability to call `set` without awkwardly having to implement `get`)
- the ability to update values prior to expiry (prior to now pre-expiry updates were prohibited)