Enable lock debugging
Add a simple double-bufferred work queue implementation, to be used for
executing asynchronous house-keeping tasks.
Add high-level deferred work API.  In particular add deferred methods
for removing an inode completely from the filesystem, as well as
removing an entire tree of inodes.  These both must run asynchronously,
to avoid deadlocks.
Do not set deletion_in_progress when unlinking.  This should be used
only for inode garbage collection.
Add wq.h and deferred.h to main header file, so clients can use the work
queue and deferred API.
Perform ENOTDIR check earlier so we can bail earlier if this is the
case.  Also, be more explicit about checking to see if an entry got
removed while we were resolving a path.
When creating an entry, if there is a name collision, check to see if
the inode is in the process of getting garbage-collected.  If so, then
cull it from the parent and proceed to create as normal.
Condense inode cleanup logic in close()
When creating a directory, if there is a name collision, then see if we
can garbage-collect the existing inode.  If so, then clobber the
existing name.  This is to make mkdir play nicely with deferred inode
removal.
When making a special file, if there is a name collision, first see if
we can't garbage-collect the existing inode.  If so, then clobber it.
Also, enforce name length limits.
* better directory set initialization logic
* refactor/clean up fskit_entry_detach_ex
* add fskit_entry_try_garbage_collect() to see if we can garbage-collect
an inode (i.e. if we're trying to replace it)
* add better logic for destroying and cleaning up an inode