Block.connect: allow 'connect' to be called in parallel

Instead of storing a Blkfront.t in the devices table, we store
a Blkfront.t Lwt.t. When an entry is missing, we create an
Lwt.task and insert that thread before calling plug(). Any
parallel caller will bind to this thread, instead of calling
plug() in parallel (which doesn't work)

If the case of a device name translation (e.g. xvda -> 51712),
we cache the device under both names.

Fixes: mirage/mirage-block-xen#31

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