kernel - Add vsyncscan() infrastructure

* For VFS's which support it, allows vnodes with dirty inodes to be placed
  on the syncer list rather than just vnodes with dirty buffers.  The VFS
  can then implement its VFS_SYNC ops by calling vsyncscan() instead of
  vmntvnodescan().

* On large systems with potentially hundreds of thousands to millions of
  cached vnodes, this reduces sync scan overhead by several orders of
  magnitude.

* Add the VISDIRTY flag to vnode->v_flag to indicate a dirty inode, adjust
  syncer add/delete code to use the flag.

* Cleanup vfs_sync.c.  Always initialize mp->mnt_syncer_ctx to something.
  Change the kern.syncdelay sysctl to use SYSCTL_PROC which properly
  range-checks syncdelay.

* Implement vsyncscan() which only scans the syncer lists for a mount point.
hammer - Use new vsyncscan() mechanic.

* Use the new vsyncscan() mechanic, greatly reducing the work involved
  in finding dirty vnodes in hammer_vfs_sync() and during unmounting.
  Call vsyncscan() instead of vmntvnodescan().

* We set VISDIRTY in the vnode and call vn_syncer_add() when an inode
  becomes dirty.  This ensures that dirty vnodes are placed in the syncer
  list even if the vnode has no related dirty file data buffers.

  Previously we had to do a full scan of the mount's vnode list to
  find dirty inodes.
hammer - Use new vsyncscan() mechanic (2)

* Fix crash, VISDIRTY must be cleared in reclaim.

* Implement convenient API functions to set and clear VISDIRTY and
  properly synchronize the syncer list.
hammer - Use new vsyncscan() mechanic (3)

* The vsyncscan() feature requires using MNTK_THR_SYNC, otherwise the
  callback has to deal with vnodes unrelated to the mount point.
  Assert this in vsyncscan().

* Enable MNTK_THR_SYNC in hammer

* Cleanup edge cases in the scan2 callback.