A cache enforcing time expiration and an optional maximum size.
When a maximum size is specified, the values are dropped in the
order of expiration date, e.g. the next value to expire is dropped.
This cache is intended for high read scenarios to allow for concurrent
reads while still enforcing expiration and an optional maximum cache size.