Add a $.fn.bindClass function for mapping an attribute to a class.

bindClass is used when you want to toggle whether a class is on an
element based on the value of a boolean attribute. It adds or removes
the class initially based on the attribute at the time of binding, and
responds to all updates to the property.

Like the other binding functions, it also supports an 'inverse' option
for flipping when the class will be present.
Update DiffCommentBlock to be an AbstractCommentBlock in DiffReviewable.

DiffCommentBlock is now based on the AbstractCommentBlock{View}, which
allows us to eliminate the majority of the code and take advantage of
all the niceties that the Reviewable infrastructure gives us.

Some of the AbstractCommentBlockView code had to be made more flexible
with regard to positioning of tooltips and update bubbles, but otherwise
it's basically unmodified.

This also ends up fixing a long-standing bug where a comment in an
expanded region would not show up again if the chunk is collapsed and
then re-expanded.

Most of the code from diffviewer.js is now gone with this change.
Update DiffCommentBlock to be an AbstractCommentBlock in DiffReviewable.

DiffCommentBlock is now based on the AbstractCommentBlock{View}, which
allows us to eliminate the majority of the code and take advantage of
all the niceties that the Reviewable infrastructure gives us.

Some of the AbstractCommentBlockView code had to be made more flexible
with regard to positioning of tooltips and update bubbles, but otherwise
it's basically unmodified.

This also ends up fixing a long-standing bug where a comment in an
expanded region would not show up again if the chunk is collapsed and
then re-expanded.

Most of the code from diffviewer.js is now gone with this change.
Rename addCommentBlocks to loadSerializedCommentBlocks.

"addCommentBlocks" was pretty confusing, so it's been renamed to
"loadSerializedCommentBlocks." The parameters have been updated to be a
little more clear as well.