Good progress today, though it's taken a few days for the design to coalesce in my head ... async i/o implementation designs are always tricky, thank god I've implemented them before otherwise it takes weeks to bashing the head against the wall!

All async i/o ops are now batch ops which generate and return a unique id per op with a future to an async_io_handle. This lets you distinguish between uncompleted ops properly.

Broke out common parameters into separate C++ types and used those to overload and partially specialise template implementation of the async op completion dependency management. The new code is vastly more generic and reusable, and makes good use of variadic templates.

Finished off async posix compat implementations of mkdir, open, fsync and close.