Bump to 2.0 beta 4 dev.

This will likely become RC, barring any major bugs in beta 3.
Fix DifFParser preamble parsing with weird unicode.

One of the old review requests on r.rb.o has a diff file which is basically
utf-8 encoded garbage. This was causing an exception because we were trying to
concatenate strings and bytes together, which caused it to try to decode the
utf-8 text as if it were ascii. Adding some 'b' prefixes to our strings keeps
things in the bytes realm.

Testing done:
Looked at the /diff/raw/ page for both the broken review request, as well as a
couple ones that had valid diffs.
Merge branch 'release-2.0.x'
Encode markdown html text to utf-8 before passing into minidom.

minidom doesn't seem to like unicode objects (and tries to decode them as if
they were ascii). The trivial fix is to encode to utf-8 before calling
parseString.

Testing done:
Looked at /r/2568/ from r.rb.o, which previously caused a traceback. Saw that
both the description and the change description field correctly rendered the
unicode text.
Merge branch 'release-2.0.x'
Return an error when trying to POST a diff on a review request with no repository

The diff-list API didn't check that the associated ReviewRequest had a
repository before it started trying to parse things and validate the uploaded
data. This meant that trying to add a diff (likely via rbtools) to an
attachments-only review request would cause an exception on the server.

I've added a test for this, and fixed the bug. While I was trying to decide on
the right WebAPIError to use, I noticed an ugly misalignment in errors.py, so
I've fixed that too.

Testing done: Ran unit tests.

Fixes bug 3258.

Reviewed at https://reviews.reviewboard.org/r/5522/
Fix order of checks in git diff parsing.

One of our old review requests was causing an exception where it was indexing
past the end of the diff. The issue here is that we added code to check for
new file/moved file/mode change state, but that code was added above the index
check instead of below it.

Testing done:
Loaded the review request that was causing the error. Before this change, it
caused an exception. After, it loads fine.

Reviewed at https://reviews.reviewboard.org/r/5523/
Fix unicode handling in git diff parsing.

We still had some lingering type problems distinguishing between unicode and
bytes in parsing git diffs. This meant that diffs that including utf-8
characters would cause UnicodeDecodeErrors when type coercion tried to
interpret utf-8 encoded text as ascii. One example of this is the diff attached
to /r/3749/.

This change makes sure that during the diff parse, we're always treating the
text as bytes. While this is theoretically bad for non-utf8 encodings, it's no
worse than we've always had, and makes it so we can actually parse these diffs.

Testing done:
Loaded /r/3749/. Saw the page instead of a traceback. Verified that the raw
diff returned the right utf-8 encoded patch.

Reviewed at https://reviews.reviewboard.org/r/5524/
Fix changedesc captions field for screenshot objects.

The new captions code for changedescs was trying to access a 'filename'
property on Screenshot objects, but they didn't define such a property. This
change adds it.

Testing done:
Viewed /r/822/ from r.rb.o and saw a usable page with a change description that
included the caption, rather than a traceback.

Reviewed at https://reviews.reviewboard.org/r/5525/
Merge branch 'release-2.0.x'