Change the only user of vdsk_read() to vdsk_readv(). This simplifies
the interface at virtually no cost.
Remove the unused vdsk_read().
Change the prototypes of vdsk_readv() and vdsk_writev() so that they
don't return the amount read or written with -1 indicating an error,
but rather just return the error. We don't support partial reads or
partial writes, so trying to be like the quirky POSIX interface is
just quirky.

Rename the functions by dropping the v suffix. We're less like preadv
and pwritev now than before and we don't have the non-iovec variants
to distinguish from.
Rewrite the raw disk support as a file format. This involves:
1.  Defining a structure to represent a file format,
2.  Implement an ordered probe to match formats to opened files,
3.  Move calls to preadv(2), pwritev(2) and fsync(2) in the API functions
    into the format-specific methods,
4.  Change the API functions into thin wrappers around the methods.

The ordered probe combines priority with capability. The priority is
based on the presence and location of metadata. The capabilities
are for writing and support for device special files. The intend is
to have the raw format probe as a last resort as ithere's no metadata
associated with the format.
Add qcow.c, vhd.c and vmdk.c for adding support for QCOW, VHD and VMDK
(resp.). These formats return nothing but errors, but help to test the
probe logic.
It's generally good to be able to detect a format, even if support for
it is not present. It avoids treating the file as a raw disk.
Make a mutable copy of the libvdsk_formats linker set so that we can
white-out the formats we probed as we re-iterate over the set with
different probe flags.
Flag VHD and VMDK as writable formats now that the probe seems to work
and seems to respect the flag.
Code the probe a bit better so that it isn't a memory leak. Also mark
the format as writable.