Retry fetching a file using the base commit id if the original rev fails

When developing with Mercurial, a common workflow is to be working on a series
of patches at any one time, and push/pop them as required. So, "hg log" might
list something like:

5 qtip [mq] patch3
4 [mq] patch2
3 [mq] patch1
2 qparent second checkin
1 first checkin

When creating a review request, 'rbt post qtip' creates two diffs: from 2-4
(the parent diff) and 4-5 (diff in review). The problem occurs when a file is
changed in patch3 that's not in any of the previous patches. In this case, the
diff in review is relative to changeset 4, but "hg cat -r 4 path/to/a/file"
fails because the file isn't in the parent diff.

Work around this problem by trying to get a file from the base commit id if
fetching it via the revision recorded in the diff fails.

Testing Done:
Pushed 4 patches and ran 'rbt post qtip'; verified that the diff viewer showed
all of the changes.

Reviewed at https://reviews.reviewboard.org/r/5965/
Allow user-customization of the default SVN backend.

Users may end up having both PySVN and Subvertpy installed on the same
system. A previous change had SVNTool favor PySVN over Subvertpy, but
it's useful to be able to specify which one specifically should be used
(especially for development and testing).

The list of possible backends is now specified in
settings.SVNTOOL_BACKENDS. It can be overridden to choose a different
backend (even a custom one, in theory).

This will also form the basis of new multi-backend unit tests.

Reviewed at https://reviews.reviewboard.org/r/5970/
Run SVN unit tests with both PySVN and Subvertpy backends.

The SVN unit tests are no longer simply based on what SVN backend we
have installed on our machine. Instead, we now run two copies of the SVN
tests: One with PySVN, and one with Subvertpy.

If a particular backend is not installed, those tests will be skipped.

Reviewed at https://reviews.reviewboard.org/r/5972/