Much to my amazement it actually works ... albeit with a segfault on process exit, which suggests memory corruption.

Mapped in boost::promise.

Added async_file_io_dispatcher::completion() which invokes some arbitrary callback function when its dependency completes. This simply reused the existing internal machinery.

Added when_all() which uses the aforementioned callback to gather up results into a promise which signals when all the dependencies complete.

Fixed up async_path_op_req to absolute and make preferred string paths, while accepting filesystem::path as is (though they must be absolute).