Volume reconciliation loop

Implements a reconciliation loop that tears down volumes that are no longer in use by any pod.

The set of valid volumes are determined by iterating through the list of manifests. The set of active, or mounted, volumes are determined by traversing the root working directory path for any existing volumes. These maps are compared, and if an active volume does not have a match, it is unmounted and removed.

This allows a kubelet to properly remove mounted volumes and clean up after itself in the event of a crash/restart.
Option 1:

Factor the functions as:

TearDown() {
  tmp = renameDir()
  go removeDir(tmp)
}

removeDir(dir string) {
  os.RemoveAll(dir)
}

If you test that the path (GetPath()) no longer exists after TearDown() and you test that removeDir() removes a directory, then I'd let you call TearDown() well-enough tested.

Option 2:
Call TearDown(), verify that GetPath() is gone, then loop for up to 10 seconds waiting for the directory to be empty.

Option 3.
Add a DiskReclaimer object, mock it out for the test.  I suspect this is where we will end up, but not where we should start.