block: add a 'disconnect' operation and a Disconnected error

When we 'disconnect' the underlying implementation is able to free
resources associated with the device. The 'disconnect' function is
guaranteed to succeed: it never fails (for example) if a remote server
cannot be reached.

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