xen: implement multiple grant map/unmap

The previous code was issuing one hypercall per grant mapping.
Instead we pass an array of grant references and Io_pages to the
C stubs and execute one big hypercall. This is particularly important
in the unmap case, since the number of TLB flushes strongly
affects both performance and scalability.

Note this code is for mapping foreign memory i.e. the kind of
action performed by a disk or network *backend*. It does not
affect a frontend.

Note: the grant_table.h header implies that it's possible to set
host_addr to zero and have everything just work. This appears to
be false: the granting side complains that the pages are still un
use unless I remember the host_addr and resupply it later.

Signed-off-by: David Scott <dave.scott@eu.citrix.com>