Prepare vionet to be handled asynchronously to the VCPU thread
This splits the handling of received data into a separate function
that can later be called in parallel to the VCPU thread instead of
handling received packets on VCPU exits only.
It also makes virtq accesses in the rx path safe to run in parallel
to the VCPU thread: the last index into the 'avail' ring the driver
has notified to the host is kept track of. It also makes sure that
the host only writes back to the 'avail' ring instead of modifying
the whole receive virtq.
While there, describe what virtio_vq_info and virtio_io_cfg are used
for, as suggested by mlarkin@
ok mlarkin@