Abstraction of storage used by sandbox
As part of the work to include content-addressable storage as a backend for BuildStream (see also #387 (closed)) we need to abstract the use of the sandbox's storage so BuildStream and plugins can use storage without being coupled to a specific implementation.
Create a virtual directory class which acts as an interface to the storage used by sandboxes and alter all existing code to use it instead of handling files and directories.
Also add a plugin configuration variable called BST_VIRTUAL_DIRECTORY which indicates whether a plugin uses the new interfact, and which we can use to dynamically choose a backend for a particular plugin.