Remote.get_tree()
separate KeyVal into its own class, with a dict interface
Rule.get_tree()

Neither Rule.get_tree nor Remote.get_tree is currently handling imports.
We need to add that back in next.
prevent git from reading global configs
reimplement export_tree with git-checkout

export_tree() now takes an optional previous_hash (defaults to a hash
representing the empty commit). The export is then implemented as a
checkout from the previous_hash to the hash being exported. That means
we get status checking for free. We will also use this feature to keep
imports clean in local modules.