Filter branch

This adds an idiomatic c-sharpy api for doing filter-branch-like operations. This works without ever touching the index or the working directory, so it should be wicked fast.

- [x] Header rewriting (author, message, etc)
- [x] Tree rewriting using `TreeDefinition`
- [x] Tag rewriting (like `--tag-filter`)
- [x] Parent-commit munging (like `--parent-filter`)
- [x] Back up original refs to `refs/original`
- [x] Name review
- [x] XML documenation
- [x] Squash

The API looks like this:

```csharp
repo.Refs.RewriteHistory(
	// A collection of commits that should be rewritten
	repo.Head.Commits,

	// A function that returns a `TreeDefinition` for the new commit
	commitTreeRewriter: c =>
		{
			var td = TreeDefinition.From(c);
			td.Remove("README");
			return td;
		},

	// A function that returns header information to be used for the new commit
	commitHeaderRewriter: c =>
		{
			var ch = CommitRewriteInfo.From(c);
			ch.Message += "\n\nCleaned-by: The Cleaner";
			return ch;
		});
```