This adds a cache structure with timeout handling and cache cleanup. Also adds some testing of the new functions.
Create cache-like directory trees on disk and check that the info is read as expected and that the expected caches are removed by `shrink()`.