Extract pull request behaviors into a set of classes.

This is a bit of a complicated refactor, but greatly helps reduce the
complexity of the main BuildRelease command and increase the
expandability of the Change sets to make it easy to support changes
besides pull requests (i.e., merges and commits).

A Change is essentially a single item in the release notes.  Right now
the only type of change supported is a PullRequest, although more can
hopefully be added easily.  The change, besides storing the data, also
defines the output formats of the change.

A ChangeList is a small abstraction around an array of changes to help
abstract out simple behaviors like converting the list to Markdown split
up by change type.

The factory classes exist to encapsulate the logic behind creating
Changes and ChangeLists.

Because changes need user intervention (in order to specify the "type"
of the change), The change factory takes a function that performs this
selection in order to keep the UI code out of the Change "library" code.

The ChangeList factory simply wraps the change factory and uses the
github client in order to initialize it.