Protect against comment objects without reviews when loading a review UI.

Somehow, in my database I ended up with comments that were not
associated with a Review. While this is unlikely in production, it's
good to check for this, as it'll otherwise result in a confusing
JavaScript syntax error when rendering the template.

Now, when loading comments, we catch exceptions when attempting to get
the review, and ignore the comment.
Add support for JavaScript-side extensions to Review Board.

A Review Board extension can now define a JavaScript counterpart that
can plug into hooks in JavaScript, in order to augment functionality.

Previously, an extension would have to define a TemplateHook with a
script to load, which would then have to monkey-patch its way into
things. We're moving beyond that now to provide a solid way of hooking
in.
Add extensibility to the comment dialog.

The comment dialog is now extensible through a CommentDialogHook. Such
hooks provide a view that will essentially layer onto the CommentDialog
and can manipulate or listen to it or its associated CommentEditor.

Some of the internals of CommentDialog have been made public for use by
extensions.

Right now, hooks can manipulate the buttons and trigger operations such
as saving. Later, we'll probably want to allow it to add additional
fields.
Add a hook for displaying extra comment information for reviews.

This introduces a new hook, CommentDetailDisplayHook, which can be used
to display additional data in reviews and in e-mails (both HTML and
plain text). An extension can use this to show information such as, say,
the severity of a comment.

This does not provide the ability to display in the review dialog, as
that's generated in JavaScript entirely. That will be added in a future
change.