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.
This error path is currently returning EINVAL, which is an unexpected error for POSIX applications trying to open an object. Maybe we should return ENOENT instead, that is, if the table is incomplete it doesn't yet exist?