Add (disk) caching for retrieving a comments hierarchy

Finding all of the comments under a directory hierarchy was the
one remaining expensive filesystem walk operation that was uncached.
This requires adding a new low-level storage cache interface so we can
support explicit invalidation, since a real heuristic validator for this
would require stat'ing too many directories.

- storage.py: allow us to get the timestamp of a cache quad (if it
  exists). This allows us to easily create flag cache entries.

- rendcache.py: use the new storage interface to implement retrieving
  and invalidating 'flagged' cache entries, ones that are validated
  by a (separate) flag cache entry. The specific cache entries
  are associated with a path (as usual) but the flag is global; it
  invalidates everything. This is by far the simplest approach for caching
  hierarchical things (since you don't have to invalidate 'down' below
  you). These cache entries are part of the heuristic generator cache but
  they use a new TTL setting instead of the normal render-heuristic-ttl
  (and its default).

- comments.py: use the new rendcache interface to cache the results
  of model.comments_children() for a given page, and to invalidate
  the whole collection of such caches when a comment is posted.
  In the process this information is also cached in the context (for
  the current request) so that repeated comments-related macros or
  renderers don't repeatedly redo this lookup.

- atomgen.py, macros.py: use the new comments interface instead
  of model.comments_children().

- test/pages/dwiki/^(Caching ConfigurationFile): document all
  of this.

Some other changes worked their way into changeset; more code comments,
more and better documentation of this and that.