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.
It's more related to a lack of information upon losing the manifest. When a pod is deleted, it's representation in the manifest is no longer available(I believe). The Builders use the api information to construct and mount the volume while the Cleaners (at least at this point) just need to know what type of volume is present and where it is mounted. Without some sort of state machine we can't rely on any information except what is "encoded" in the mount path, so in order to reconstruct the correct driver, the Cleaner needs a different, smaller set of information. I would ideally like to use the same type for both, but I couldn't figure out how to get around losing that information in the event of a crash.

One thought I had was to have one struct implement all of the interfaces, but only partially create it with the information needed for the scenario. Typing it as the interface would then only expose the methods that can be called without breaking, but I was unsure if this is kosher or not. This would have two factory methods for the same struct, but one of them would be incomplete.