Rename fsengine-basic to ioengine-basic
provider-fs: Add options engine_{copy,move,delete}

The IO engine to use can now be set via those options. A GArray also feels
like better memory wise then a GSList.

(Note: priv->io_engines isn't behind a lock because it should be read-only
once it was set on start, since we should also add a matching extra in
config. This is still TODO though.)
provider-fs: engines: Add %n for new_name in the parser
ioengine-basic: Remove unused code
provider-fs: Fix parser helper (use DonnaContext)

No reason to re-implement a parser when we have DonnaContext. Also this
means consistent behavior, including the need to use DEREFERENCE_FS in
the variables.
app: nodes_io_task(): Only use new_name when applicable

That is, if there's only one source. With more, we just ignore it.
provider-fs: Add command fs_nodes_io()

Similar to nodes_io() but allows to specify which IO engine to use.
(Also uses different default options fs_engine_* before falling back
to engine_*.)
Add ioengine-exec

Because those tasks are either not returning anything, or returning
something "wrong" (i.e. the command's output instead of the array of
copied/moved nodes) we need to ignore the return value.

This is done by adding data "donna-ioengine-exec" to the task, in which
case nodes_io() and register_nodes_io() will ignore the return value.
Obviously if those commands has their return value used, it will fail
since they have none. (Hence fs_nodes_io() for such cases.)

This IO engine isn't really the best for those reasons, but allows to
easilly use whatever one wants to copy/move/delete stuff, which can be
nice/useful/better than ioengine-basic.