zvsh: rewrite the `run_zerovm` function

This is pretty much a complete rewrite of the `run_zerovm` function and
subordinate utilities/classes. The previous implementation was broken
and wrong, and didn't support zvsh execution with a single nexe.

Below are the major features which didn't work properly and should be
fixed now:

    - proper handling for the cases when std{in,out,err} are ttys/not
      ttys, are files/pipes, etc.
    - propagation of config file read/write limits to channel creation
    - propagation of zvsh.cfg [fstab] configuration (for "default"
      images)
    - propagation of zvsh.cfg [env] settings
    - environment var handling, from the command line (with the @FOO=bar
      syntax) and zvsh.cfg
    - executing a bare nexe in the manner of `zvsh foo.nexe` (and not
      just from an image, in the manner of python) works now
tests/zvsh_test: rewrite/add to `run_zerovm` tests

This change rewrites a lot of tests which were exercising the previous
(broken) functionality for the `run_zerovm` code.

Test coverage is now sitting at a whopping 45%!
zvsh: switch to the new `run_zerovm` function

This only applies to normal run cases for zvsh. It does not apply to the
gdb case (which still needs to be rewritten using the new tested
implementation).