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.
I'd move this line into the if/else, I think that's the only way it can be set.
```
diff --git a/src/session/session_dhandle.c b/src/session/session_dhandle.c
index 1f60bd5..106825b 100644
--- a/src/session/session_dhandle.c
+++ b/src/session/session_dhandle.c
@@ -415,13 +415,12 @@ __wt_session_get_btree(WT_SESSION_IMPL *session,
                /* Try to lock the handle; if this succeeds, we're done. */
                if ((ret = __wt_session_lock_dhandle(session, flags)) == 0)
                        goto done;
+               WT_RET_NOTFOUND_OK(ret);
 
                /* We found the data handle, don't try to get it again. */
                LF_SET(WT_DHANDLE_HAVE_REF);
        }
 
-       WT_RET_NOTFOUND_OK(ret);
-
        /* Sweep the handle list to remove any dead handles. */
```