v2v: Change input and output variants into classes.

Previously Types.input and Types.output were variants, resulting in
the main v2v.ml code having to have knowledge of all the input and
output types.  So you would end up with code in v2v.ml like:

  match output with
  | OutputLibvirt -> (* call some libvirt-specific code *)
  | OutputRHEV -> (* call some RHEV-specific code *)

This changes these types to be abstract superclasses, with specific
implementations provided by (and hidden inside) each input/output
module.  The above code in v2v.ml now becomes:

  output#call ... (* no backend-specific knowledge needed *)

Although this commit is very large, it is just refactoring.  There is
no functional change in the code.
v2v: Print log message when opening the source.
v2v: Pass verbose flag into every input and output subclass.