Add a document on reviewing text files.

2.0.x includes a text file review UI, which syntax highlights based on the
mimetype and allows adding comments to each line, much like the diff viewer.
While we were shipping the feature, we never had any documentation about it.

Testing done:
Built and checked html docs.

Reviewed at https://reviews.reviewboard.org/r/6452/
Switch to using ForwardingCacheBackend for all cache requests.

We now force ForwardingCacheBackend as the default cache backend, and
instead work with the 'forwarded_backend' cache name when looking up or
saving the real cache backend.

This covers the configuration forms, cache stats, and initial settings
population.

Reviewed at https://reviews.reviewboard.org/r/6482/
Fix "List index out of range" errors with interdiffing deleted files.

It's possible to hit an IndexError when processing an interdiff between two
changes that delete a file. The wrinkle here is that between the two revisions
of the diff, some additional changes to that file were made (and synced to the
local developer's tree).

The result of this is that we didn't filter out the file from the list of
things to show for the interdiff, and then things went wrong when we tried to
process the opcodes for diffing two empty strings.

While I was doing this, I saw some warnings about a unicode-unaware comparison
occurring, so I've slipped the fix for that in as well. This doesn't actually
have any correctness implications, it just speeds up things slightly when
dealing with empty files.

Testing done:
- Created a reproduction case for the bug and tested before and after the
  change. Before, I saw an entry for this file with the error inside. After,
  the deleted files don't show up at all in the interdiff.
- Ran unit tests.

Fixes bug 3481.

Reviewed at https://reviews.reviewboard.org/r/6473/
Fix some empty interdiffs resulting in a single equals chunk.

MyersDiffer had a bug where, if given an empty set of strings to
compare, it would yield an equal chunk. This could happen with
interdiffs when dealing with two deleted files, since both would end up
with empty strings.

The assumption was that if we reached the end of the processing and
haven't yielded anything, that it's an equal file. We'd then yield an
equal chunk with the ranges. In this case, the ranges would be 0,
causing index errors and bad assumptions later on. We now check for this
early and just bail.

Reviewed at https://reviews.reviewboard.org/r/6484/
Fix issues around the Whitespace Only logic and presentation.

If a file was processed that had no chunks, it would be listed as
whitespace-only. This was because the logic computing this would default
to whitespace-only, and then override that if it found any non-equal
chunks that contained real changes. For empty files, there were no
chunks to process, so this flag would be incorrectly set.

Even if the flag was correctly set, it still looked broken, as the
message describing that it's whitespace-only would be hidden by default.
The CSS rule for this has been removed.

While here, I also fixed up the labels for the toggles to not have such
varying mixed caps. That's been bugging me.

Reviewed at https://reviews.reviewboard.org/r/6485/
Compare file SHAs to determine if files can be skipped in interdiffs.

We attempt to keep unmodified changes out of the diff viewer when
viewing interdiffs. To do this, we compare the deleted flags and also
the diff contents. However, if the diff content simply has a small
change, like a difference in timestamps in the headers, this check will
fail and the otherwise unmodified file will be shown.

Now, when we generate diffs, we calculate SHAs and store them in the
file's extra_data. We can use these to compare the SHAs of patched files
to see if there will be any changes to show.

Reviewed at https://reviews.reviewboard.org/r/6486/
Add draft release notes for 2.0.9

This covers all of the changes that will ship in 2.0.9.

Testing done:
Built and reviewed HTML docs.

Reviewed at https://reviews.reviewboard.org/r/6472/
Harden repository passwords in the database.

Historically, passwords have been stored in plain text when directly
providing a repository not backed by a hosting service. Now, we store
this encrypted, like we do with any sensitive hosting service
information.

When upgrading the site, all passwords will be automatically migrated.

Reviewed at https://reviews.reviewboard.org/r/6400/
Release Review Board 2.0.9.