Reduce the impact of checkpoints on cursor operations

This is an experimental branch that tries to reduce the impact of locking during checkpoints on ordinary operations.  In particular, checkpoints used to hold the schema lock, which blocked concurrent threads from opening tables until the checkpoint completed.  With this change, most cursor and table opens would be able to proceed during a checkpoint.

These changes are not ready for merge.  They need further cleanup, and there is still an occasional failure in test/fops, where a cursor open sees a table without its column group.
The table exists, but isn't valid.  EINVAL seems right to me.