Notes:
- LVM operates in "segments" which are typically (but not always) 4MiB
 - device mapper operates in sectors which are either 512 or 4096
 - the system should operate in terms of segments (being bigger) and the local allocator can translate down to sectors when needed
 - the types below haven't been optimised: in particular there's overlap between the structure of the dm types and the LVM types.
 - suspend/ resume signalling is missing
 - we should allow the ring to be poisoned, just in case someone reads a ring which has been deallocated