Make stats more robust in the face of failure

Use pid() for timer call so that a crashing stat cache does
not end up with multiple timers for the same stat mods

In some cases underlying ets tables for stats go away. When this
happens the effected stats break and stay broken.

When a stat is broken the stat calculation throws an error. For
the sake of robustness this commit wraps stat calculation in a try
catch, and returns the atom `unavailable` if a stat cannot be
calculated. Broken stats are expected to be detected and repaired
when they are updated.

Rather than calculate stats on demand when stale, backfill the cache

Always serve the stats that are in the cache, no matter how old they are.
Add a timestamp to the stats so consumers know how stale they are.
Fill the cache continuously in the background.