comments.py: blacklist update

A more scalable solution or something is needed. Someday!
testbench.py: updated to work and so on

There were various issues:
- 'localhost' no longer works as the REMOTE_ADDR; it's not 127.0.0.1
- use cProfile for profile
- add -B to conveniently disable the BFC
- update statprof invocation slightly
README: document dpasswd.py and testbench.py

Embarrassing omissions are us, especially so for dpasswd.py.
test/passwd: add a pointer to dpasswd.py

This was suggested by @augmentedfourth and you know, it's a good idea.
(So is covering dpasswd.py in the README, but that was the last commit.)
context.py: add disk caching of 'find all descendants'

context.cache_page_children() now stores its result (for real
directories) in the on-disk cache as a heuristically-invalidated cache
entry. This is a bit sleazy (especially because invalidation is a bit
tricky) but is very much worthwhile for WanderingThoughts.

Today's moral: filesystem walks do not scale up really well. What
was fast with a hundred files is not necessarily so much with a few
thousand.

- atomgen.py changed to use context.cache_page_children() to take
  advantage of this cache
- documented in test/pages/dwiki/Caching

This is not the full change but is the easily-separated bit. Bad me.
Various speedups and optimizations

The largest single performance increase comes from a sleazy hack
in pages.py to make virtual directories use the newly-cached
context.cache_page_children() when walking the real directory
hierarchy. This change drastically speeds up all virtual directory
based things in Wandering Thoughts.

Other changes are smaller but include fiddling in storage.py and
pages.py to basically eliminate pointless lstat() calls (these are
a surprisingly hot path in many cases) and some code bumming.