refactor: Refactor metadata and datasources to be more testable

The bulk of this PR is in https://github.com/crawford/coreos-cloudinit/commit/a923161f4acfd4091994ff0b4765e7fe6647ab60.
I think I'm missing something - why is this factored out if it's the only service using it?