[Fixes #64815308] Diff and dry run functionality

Output diffs and add a "dry run" option. This functionality is available as both a library and from the CLI.

The output from the CLI looks like this:
![screen shot 2014-06-04 at 10 40 05](https://cloud.githubusercontent.com/assets/260438/3171828/3b195ffe-ebcc-11e3-846f-4e42e0e3f99e.png)

The changeset might look a bit monstrous but it's mostly tests. I've broken it into fairly atomic commits working from the bottom up, so you might find it easier to review that way, but please leave commits on the complete diff rather than the individual commit.

/cc @ripienaar, I'd appreciate your thoughts on the use/output.