Well it compiles and it theory ought to work, but it doesn't ... hanging on a spinlock for some reason.

Added a has_even_been_fsynced flag so we can detect when to fsync the containing directory on Linux.

Added the infrastructure for retiring completed i/o ops and executing their completion chain handlers.

Fixed up the unit tests to cope with the new batch API.
Just occurred to me that I was executing the completion handlers immediately, which would block later completions from running in parallel. Fixed, but now I have no way of writing completion futures back ... but it's Friday evening and it's nearly 7pm, and I will get in trouble if I don't go home now ... till next week so.