Branch.Remote property should not throw

The Branch.Remote property can throw when it attempts to resolve a remote
for a remote-tracking branch, and the remote cannot be found or is
ambiguous. In those situations, Branch.Remote should return null. If there
is a need for the specific exception to be returned, we can look at
transitioning to a method for this functionality.
Verify that resolving a remote-tracking branch's remote can throw
Throw NotFound and CannotDereferenceToCommitExceptions

This change is to throw more specific exceptions in several cases when
possible. If an object cannot be found, throw a more specific
NotFoundException. If an object exists but cannot be dereferenced to a
commit when requested, then throw a CannotDereferenceToCommitException.
Introduce RefToMergeNotFetchedException

This adds a  strongly typed exception to indicate when a pull is
performed and a reference for the configured merge branch was not fetched.