Switch to Begin_roots/End_roots around the libvirt -> OCaml callback

This allows us to interleave the {enter,leave}_blocking_section stuff
correctly so that we aren't manipulating the GC roots without holding
the lock. If we used CAMLlocal/CAMLreturn then we would be unable to
drop the lock after the CAMLreturn without nesting another function.