Initial support for abstract capabilities in Vagrant.

The intended change here is to abstract out the guest capabilities into
a more generic solution that can be quickly extended. Vagrant plugins
should be able to define a capability and register it with the
appropriate type (e.g. guest, host or provider) during plugin
lazy loading.

This can allow for the Vagrant to query different levels of the
subsystems that power virtualization. If snapshotting is supported at
the guest, host and provider level we may want to specify which to use.