Some things we definitely don't want to generate every frame, such as
relative-time formatted strings, as that would create a heap allocation
each frame.
Introduce TimeCached<T> which is responsible for updating some state
after some expiry.
Signed-off-by: William Casarin <jb55@jb55.com>