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