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.