Connect widget signals during RB initialization instead of module load.

reviewboard/admin/__init__.py was connecting to save/delete signals for
Repository and Group in order to invalidate widget caches, in order to
keep the dashboard up-to-date. However, doing it during module load
resulted in some circular import issues, which manifested in various
ways over time, but are now impacting the docs generation.

Now, the signal connections and invalidation live solely in widgets.py,
in an init_widgets() function.

The top-level reviewboard.admin module listens for Review Board's
'initializing' signal and, when called, it invokes the init_widgets().

This allows us to build docs again, and should resolve some of the other
cases we've seen over time.

Reviewed at https://reviews.reviewboard.org/r/6370/
Prevent users from publishing empty (no modifications made) review request drafts.

When a user submits an empty draft for a review request a warning is issued to
let them know they did not make any modifications.

The general flow is:
1. In the review_request_draft model determine if there were any changes to any
   of the fields, if not then raise a 'Not Modified' exception.
2. The review_request_draft controller/resource will catch the 'Not Modified'
   exception and return an appropriate error message to the Client JS to
   display a meaningful message to the user.
3. Client JS displays error message and the 'Publish Changes' and 'Discard
   Draft' buttons re-enable.

Testing done:
Tried "not-modifying" the Description, and Testing Done fields to determine the
output.

Wrote test case to publish an empty draft (test case passes).

Postive Test Cases:
* Added a file (successful publish).
* Remove a file (successful publish).
* Changing the description field (successful publish).
* Add comments (successful publish).
* Add branch/target people/bug number.

Fixes bug 3452.

Reviewed at https://reviews.reviewboard.org/r/6322/
Merge branch 'release-2.0.x'