Make review branch archival more robust

It used to crash if it encountered a review branch that didn't actcually
exist in the repository, and if the (missing) review branch according to
the database referenced a commit that didn't exist in the repository, and
if review branch in the repository pointed to a different commit than it
was supposed to according to the database.

Handle the first two classes of errors by simply ignoring them, and just
setting the branch's "is archived" flag to true.

Handle the last class of errors by silently not archiving the branch (or
setting its "is archived" flag.)  If called because an archival was
scheduled, the branch would not be scheduled for archival again (by this)
so we'd just leave it as-is until something else happens.
Remove dbutils.Branch.{head,tail,commits} attributes

Instead, add getHead(), getTail() and getCommits() methods (of which the
first already existed.)  These all raise an gitutils.GitReferenceError if
a commit they would have returned doesn't exist in the repository.

Also drop the loadCommits() method, and the (similar but different)
load_commits arguments to Branch.fromId() and Review.fromId().

Previously, the Branch.head attribute was set to None by Branch.fromId()
if load_commits was false, *or*, silently, if the commit was missing.  The
Branch.tail attribute, OTOH, was set to None by Branch.fromId() if
load_commits was false, but raised an exception if the commit was missing.

The load_commits argument, surprisingly, didn't mean the same as calling
loadCommits(); the latter set all of head, tail and commits, whereas the
former only set head and tail, leaving commits with a None value.

Also, the requirement that either load_commits=True be used, or that
loadCommits() has been called, before head, tail or commits are accessed
(to get non-None values) just leads to harder-to-follow and fragile code.
Better to have accessors that actually fetch the information if needed.