use weft runnable abstract classes for timer threads, and provide caching and burst-writes for flat-file block store (this is important when many things are timed to expire at the same time, and the block file can get very large...adding a lot of single new entries results in a lot of I/O without caching).