devmapper: Make NewDeviceSetDM() initialize lazily

This way we can avoid the factory callback and lets always
cheaply instantiate the device set and pass it to multiple
places without having to do a costly initialization if its
not used.
Remove DeviceSetFactory, instead pass a DeviceSet around

We now lazily instantiate the DeviceSet, so object creation is
free and error-less. This means we can always create one and pass
around. This is nice because it allows us to pass on the DeviceSet
to other places that need it (e.g. Graph) without needing to have
a full Runtime object.
devmapper: Use nice json names
devmapper: Avoid duplicating the hash in the json file

Its already in the key, no need to have it in the dictionary entries too
devmapper: Base the device-mapper names on the root dir name

This means the default is "docker-*", but for tests we get separate
prefixes for each test.
Runtime: Remove ununsed SetDeviceSet()
Implement docker diff for device-mapper

To do diffing we just compare file metadata, so this relies
on things like size and mtime/ctime to catch any changes.
Its *possible* to trick this by updating a file without
changing the size and setting back the mtime/ctime, but
that seems pretty unlikely to happen in reality, and lets
us avoid comparing the actual file data.
Archive: Fix up tar commandline arguments in TarFilter()

There is no need to duplicate the compression flags for
every element in the filter.
Make TarFilter more useful

There are a few changes:
* Callers can specify if they want recursive behaviour or not
* All file listings to tar are sent on stdin, to handle long lists better
* We can pass in a list of filenames which will be created as empty
  files in the tarball

This is exactly what we want for the creation of layer tarballs given
a container fs, a set of files to add and a set of whiteout files to create.
Implement container.ExportRW() on device-mapper