Use rbtree instead of node_hash

XNU does not allow to specify unique id to a vnode. And when fuse returns
'ino' it is not possible to restore vnode for it. Thus fuse have to track
ino->vnode by itself.

Before fuse4x had a global map (device_id,ino)->fuse_vnode_data
implemented by nodehash.c. nodehash.c itself a poorely implemented hash structure.
Beside unreadable and overcomplicated code such structures are not
usual for kernel. Both BSD and Linux use rb-tree structure for maps, so
fuse4x should do the same.

Use rb tree implementation from OpenBSD. Keep one tree ino->fuse_vnode_data per
mountpoint.
Rename FSNodeScrub to more readable fuse_vnode_data_destroy
Remove biglock

Biglock has a few disadvantages:
 - it's a source of deadlocks when one vnop generates another vnop
 - it reduces fuse scalability by effectively making it single-threaded
 - is is enabled only in 64bit kernel, so codepath differs for 32 and 64bit
 - it has unreadable source code and makes fuse implementation more complex than it should be

Remove biglock and nodelock, mark fuse as THREADSAFE. This means that several vnops can
be generated for the same vnode simultaneously. Fuse should protect shared state correctly.
One such thing is fuse_file_handlers array in fuse_data.
Add fufh_mtx mutex - it should be locked if you modify file_handlers.
Eliminate FUSE4X_TRACE

Move its functionality to FUSE4X_TRACE_OP and FUSE4X_DEBUG
Remove unused entries from vnops array
Move vnops declaration to *.c file

There is no reason to declare vnops in the header, they are not used anywhere outside of fuse_vnops.c
Move exchange function implementation from kludge.c to compat dir

"kludge" term is misleading. compat is more widely used term for
reimplemented stuff. Move the code to compat/exchange.c
Add a stub for VNOP_ALLOCATE

On vnop_allocate (file space preallocation) do nothing and just return success.
This is needed for programs that preallocate file space ahead.
If fcntl with PREALLOCATE is called then fuse4x returns an error,
and a user program thinks that media does not have enough space. But
in fact fuse4x returns ENOTSUP (syscall is not supported).

Add a stub that returns success and makes the user-space programm believe that
media has enough space.

The long-term solution is to add FUSE_FALLOCATE fuse request type and implement it
in kext.
Add a shortcut for vnop_reclaim in case of dead filesystem

In case if the fuse filesystem is dead there is no much sense to
make requests to userspace. Instead skip these steps and just
perform finalization.
Invoke FUSE_DESTROY only after we reclaim all vnodes

Send FUSE_DESTROY only after reclaiming all vnodes.
Otherwise the userspace does not receive reclaim commands.
Remove aux_count field from fuse filehandler

It was used to catch a race condition issue when reclaim is called on a valid vnode.
It is not true - XNU handles it correctly and never calles reclaim on valid vnode,
instead fuse4x should call vnode_get/put when we want to prevent it from reclaiming.
Call vn_revoke when we really want to revoke the vnode

MacFuse had twisted logic when it tried to revoke a node,
it marked the node with flag FN_REVOKED, but did not call revoke
method itself.

Just use old good vn_revoke.
Use nop_revoke stub

The stub just calls vn_revoke, the same as we do in our function
Unify fuse_isdead function

There is no more FN_REVOKE flag that was used for 'soft' revoking.

Additionally check if mount data is null - this is also can be qualified as
'dead' fuse filesystem.
Remove FN_IS_ROOT flag

This flag was used only to pass a boolean value wether the vn is root.
Use bool parameter instead - this is more redable.
Remove useless flags

FN_ACCESS_NOOP is never set so the 'if' block is always false
FN_HAS_ACL, FACCESS_VA_VALID are not used
Remove useless flag FACCESS_DO_ACCESS

This flag set before calling fuse_internal_access() and
because this function only used in one place this flag is always set.
Remove unused variable

Fix a compiler warning.
Remove useless struct fuse_access_param

The only field 'flags' that was used in 'if' statement always evaluated
to 'false'.
Inline wait_for_completion flag