hammer2 - flush sequencing part 1

* Rip out the jerry-rigged flush sequencer and start work on a real
  one.

* Sync and fsync calls create synchronization points and will be serialized
  against each other.

* Modifying operations occurring before a synchronization point will stall
  modifying operations occurring after the synchronization point until
  they complete.  This will need to be optimized.

* However, the synchronization points are coded such that modifying operations
  occurring after a synchronization point will be able to run concurrently
  with the disk flush related to that synchronization point.

  So if there is only one synchronization point (sync or fsync or background
  sync) active, modifying operations will generally not stall.  At least not
  for very long.