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.
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).