Add some useful additions to the commenting and screenshot APIs.

The commenting APIs now have some additional data that can be used for
navigating to review UI URLs and seeing more info on what's being
commented on.

Diff comments can now be ordered by its fields. This is useful if you
want to get the list of all comments by file, in line number order.
Make expandedFields a BaseResource concept.

DraftReviewRequest had a concept of expanding fields in a request by
populating expandedFields. This turns out to be useful elsewhere, so
move this logic out and into BaseResource.

Now, any resource class can set the list of fields to expand, in order
to provide more detailed information or child resources to the callers.
Merge branch 'release-1.7.x'
Change how parsing of response payloads works.

Previously, every resource had to override parse(), call the parent
parse(), grab the contents of the payload within the envelope, and then
set each field in the response from the parent parse() and return it.

The problem with that is that only works if we have the envelope. That
won't work from list resources.

Now, subclasses override parseResourceData, which only needs to return
the data specific to the subclass. The rsp it parses from is guaranteed
to be within the envelope, if one exists.

parse() exists only in BaseResource now. It will remove the rsp data
from the envelope if it sees a 'stat' header. Otherwise, it assumes the
data it's dealing with is proper resource data.

This is needed for my upcoming change to introduce
BaseResourceCollection.
Fixed sending API requests with field expansion without 'data' set.

The new expandedFields was trying to set data.expand, but if data wasn't
set, this would fail. We now ensure that data is always set to something
by this point.
Don't set options.data when using a form, and fix tests.

The new change to update options.data.expand and ensure options.data is
a dictionary shouldn't apply to forms. We now only set this if it's not
a form.

Also, a couple unit tests were still thinking it should be undefined.
It's fixed now to check instead of it's an empty object.
Improve the style of the issue summary table.

This makes a few tweaks to the issue summary table. There's now more
padding in each row, making things less cramped. The double border has
also been removed, cleaning up the look. The "resolved" border is also a
lot less faint, blending in better with the other rows.

The description has been truncated at 20 words, which seems to be a
decent length. This keeps it from being a squashed mess.

The text in the cells are aligned to the top now, which helps with
wrapping. The description column now takes all the available space.

The Issue ID column has been removed. It wasn't really that useful and
didn't cleanly map (since the concept of an issue ID didn't exist
anywhere else).
Grab additional data for various resource models.

These resource models take advantage of expandedFields to get some
related objects. These can be used to render additional details for
these objects.

This is a requirement for the upcoming review dialog rewrite.
Add a base collection for resources.

BaseResourceCollection ties into our resource pagination mechanisms to
allow paging through collections of models.

The caller can do an initial fetch() to get the first page, and then
call fetchNext()/fetchPrev() to get subsequent pages.

Or, the caller can call fetchAll() to get every instance from the
server.
Fix a logic error for inserts in the new improved interdiff filter.

The new interdiff filter had problems dealing inserts in the right-hand
side of an interdiff. The way it was computing whether to switch to the
next range was incorrect. It was considering inserts as equals.

Now it matches the logic on the left-hand side.

A unit test was added based on real interdiff opcodes for a change where
this manifested.

I also noticed that my original test case did in fact have its one and
only right-hand-side insert missing, which was restored after this
change.
Move the reply draft banner out into its own view.

The reply draft banner has been moved out of reviews.js and into
ReviewReplyDraftBannerView. The new code is more "dumb" in that it
doesn't deal with anything beyond rendering and handling the
publish/discard. It's up to the caller to determine what happens after
(such as page reloading).

The floating support moved into FloatingBannerView, which
ReviewReplyDraftBannerView inherits from. This has been made a bit more
generic, so that it can be use for other banners later on.
Don't reload the page when publishing/discarding a reply.

Publishing/discarding a reply to a review no longer reloads the review
request page. That was ugly and made it easy to lose your place on the
page, especially for large review requests.

Now, discarding just removes all the comments that were discarded, and
publishing turns all the draft comment entries into published comment
entries.

As part of this, I've also cleaned up a lot of the templating around
these comments. We used to have hacks to look for IDs starting with
"yourcomment", which was stupid. We also had other IDs sticking around.
None of those are needed anymore, nor are some classes, so they've all
been removed.
Rewrite the review dialog.

The review dialog has had a full rewrite. It's no longer just a
container for a server-side rendered form, which was done in a very
hacky way and could be slow to load for large changes. Now it displays
instantly and fetches the comments itself, rendering them one at a time.

This looks the same as the old form, but with one improvement:
File attachment thumbnails are now rendered as well. They appear just
like screenshot thumbnails do. Previously, we'd only render the
caption or filename.

Unit tests were added for this.
Merge branch 'release-1.7.x'
Update the documentation for a modern Fedora/CentOS/Red Hat install.

This removes old references to the Fedora Extras repository from the
installation docs, and adds a couple sections on Fedora and other
Red Hat-based distros. These should help people get set up much quicker,
and avoid pitfalls based on old information.
Merge branch 'release-1.7.x'