First draft of proposed BLOCK_DEVICE interface

* the 'type buffer' is intended to be lists of IO_PAGE.ts ie
  always page-aligned. This isn't enforced here (can it be?)

* both read and write take lists of buffers scatter-gather style.
  It'll be important for performance to be able to submit large
  requests >> 4KiB

* a simple result type is used to return success/failure to
  discourage the use of exceptions

* we assume the requests block until they hit a permanent error.
  A permanent error means the device is broken so we don't bother
  to indicate which parts of the (write) request have succeeded.

* requests issued in parallel will be decomposed into sub-requests
  and won't be committed atomically. When an IO action returns the
  effects will have hit the backend disk.

Signed-off-by: David Scott <dave.scott@eu.citrix.com>
block: rename 'buffer' to 'page_aligned_buffer'

The page-aligned nature is important to guarantee efficient
implementations,

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