Adds a lazy, parallelizable form of `io_remove`
Adds a lazy, parallelizable form of `io_remove`

Creates an implementation of `io_remove` using Dask `delayed` objects.
If the path doesn't exist, a dummy function is `Delayed`. If the path is
a file, an `os.remove` wrapped call is delayed. If the path is a
directory, recurses through the directory structure adding all files to
leaves and making directories dependent on the removal of all objects in
them. This way nothing gets removed before anything it depends on is
removed.

This ensures that all of the objects that `io_remove` handled still get
handled in the same basic way. Also makes sure all cases can be handled
the same way and their progress tracked. Should allow the removal of
files to proceed in an embarrassingly parallel fashion (as they have no
dependencies). Allows the removal of directories to also be handled in
parallel, but not embarrassingly parallel due to dependencies. Should
speed up directory removal particularly on slow storage systems like
NFS.

nanshe-org/nanshe_workflow,DudLab/nanshe_workflow