refactor: Refactor metadata and datasources to be more testable

The bulk of this PR is in https://github.com/crawford/coreos-cloudinit/commit/a923161f4acfd4091994ff0b4765e7fe6647ab60.
There is no way to handle this, so I just take the first.