The code is pretty confused about format vs. protocol, and so are we.
Let's try to figure them out.
From cruising altitude, all this format, protocol, stacking business
doesn't matter. We provide a bunch of arguments, and get an image.
If you look more closely, providing that image involves sub-tasks. One
is to haul bits. Another one is to translate between bits in different
formats.
Working hypothesis:
* A protocol hauls image bits. Examples: file, host_device, nbd.
* A format translates image formats. Examples: raw, qcow2.