Remove an extraneous comma in ReviewReplyModel.

This comma would break certain browsers.
Update $.fn.bindProperty to support "text" and "html" properties.

These are not strictly properties in the same way that other things
passed to $.fn.prop() are, but from the caller's point of view,
they aren't much different.

bindProperty can now update the text or HTML of any DOM element
when a model's property changes.
Refactor the screenshotThumbnail code to be largely a Backbone view.

The bulk of $.fn.screenshotThumbail has been pulled out into a Backbone
view. The view handles hooking up events to the model and elements, and
performing modification and deletion actions on the screenshot.

$.fn.screenshotThumbnail itself still exists to query the proper
screenshot to populate the view with, and to hook up events to the
editing state for the review request. In time, this will all move into a
new view that owns review request editing.
Make RB.FileAttachment inherit from BaseResource.

RB.FileAttachment is now ported to Backbone, and is a BaseResource.

Since RB.FileAttachment sends file data one of two ways (through a
new-style file upload, with DnD, or a form upload), BaseResource had to
be modified to handle this, the same way the old RB.FileAttachment had
to.

Now, BaseResources can mark that they have a field representing a file
to upload. If, during save, that field has a suitable file associated,
BaseResource will go down another path for the save operation. It will
structure a payload to put up to the server that contains form data.

(It's worth noting that there's new API out there for making this much
nicer and easier to generate, but it's still a draft and not very
supported.)

If instead we're going through a formDlg (for a manual file upload, not
DnD), then we have to save by doing an HTTP POST for an HTML form, using
our form.ajaxSubmit code. (This is needed for older browsers.)
BaseResource now supports this as well. Basically, if options.form
exists, it will take precedence over all other fields and pass it down
to RB.apiCall, which will do the right thing.

Unit tests were added to this, and other code around file attachments
were changed to properly work with the new class.
Fix a couple issues with resource loading/saving.

BaseResource's URL, when containing an ID, left off the trailing slash.
While it still worked fine, it did result in a redirect, and thus an
extra call to the server for every URL.

Doing a GET had other small but harmless issues. It provided a
contentType and attribute data, even though these weren't wanted in a
GET.
Fix up local site permission denied tests.

The url resolvers changed such that we need to catch ViewDoesNotExist in
addition to NoReverseMatch. This also adds a div that we use for some style
fixes in rbcommons.
Fix links to file attachment review UIs.

Using file attachments with local sites was creating broken links. The issue
here was that it was using pk instead of display_id.
Fix the other file attachment link.

I fixed the one for the "Review" command but not the thumbnail overlay. Trivial
fix.
Fix discarding of review replies, and several issues with drafts.

Review replies weren't given the same draft logic that reviews were
given, but since they're a variant on a review, it needed the same
logic. Furthermore, replies couldn't be discarded.

A new mixin was added that contains all the draft logic. It's based on
what was in ReviewModel, but modified. Both ReviewModel and
ReviewReplyModel use it for all their draft handling now.

The logic was changed to handle the case where an object goes from
unloaded to loaded and back to unloaded (such as after a destruction).
Instead of overriding its url() and ready() functions, it now just
includes some state indicating whether to use its own functions or other
ones.

Since the mixin needs to call parent functions, but may not know what
the parent is, a _.super() function was added, which will compute the
super prototype for an instance.

BaseResource got some fixes to handle parentObject loading properly when
using an old-style resource object. It also now resets the object state
after a destroy(), so it can be used again.

In order to work around some Chrome bugs I encountered, I've changed the
draft resources on the server side to return HTTP 302s instead of 301s,
as the latter is meant to be more permanent. I've also updated the Last
Modified time when updating a reply. I'm not sure this solved all the
problems yet (time will tell, as it was intermittent), but it's probably
more correct anyway.
Bring back ReviewReply.deleteIfEmpty, and fix reply publishing.

When ReviewReply was ported over, deleteIfEmpty didn't come with it. It
was still being called though, meaning that users couldn't cancel or
delete comments.

Even if it was brought over, though, it's been pretty broken for a long
time. It didn't actually successfully delete the review reply (just the
comment), and it didn't take into account file attachment comments.

It's now ported over and rewritten to do that. Some stuff was cleaned up
to better manage the comment ID and object for an editor to make this
work better.

There's also fixes for publishing. We set the attributes after knowing
the reply is ready. Same when publishing a review, in case.
Fix should_update_issue_status to avoid uncaught exceptions.

Every so often, I see a traceback from our servers coming from
BaseCommentResource.should_update_issue_status. The issue here is that
issue_status isn't in the kwargs, but our issue_string_to_status will raise an
exception if the passed-in value is None. This changes it to always return False
in the case that issue_status isn't in kwargs, and fixes up a little bit of
formatting.

Reviewed at http://reviews.reviewboard.org/r/4025/
Merge branch 'release-1.6.x' into release-1.7.x
Merge branch 'release-1.7.x'