Upload Djblets releases to Amazon S3.

We're now using Amazon S3 to store all our releases. This updates our
release script to do that. It requires our new 'fabazon' module to help
interface with S3 and perform S3 uploading and directory index
regeneration.
Merge branch 'release-0.7.x'
Expand the amount of information in ExtensionResource.

ExtensionResource now lists additional information on the extension,
such as the summary, version, and related links. This will be used for
a slightly improved Manage Extensions page, and could be used for
command line management tools.

There's also an optimization thrown in for fetching the class of a
RegisteredExtension. Previously, calling get_extension_class repeatedly
would attempt to load the class mutiple times, but now it's cached.
Rewrite the Manage Extensions page.

The old Manage Extensions page broke with the static media
reorganization and Pipelining, as the enable/disable extension function
was wrapped in a closure and wasn't accessible.

An attempt to fix this spiraled out of control, and now there's a whole
new page. It looks exactly like the old page, but is backed by a set of
JavaScript objects that can call into the extension API to list, enable,
and disable extensions.

We'll be able to build on top of this later on for things like
interfacing with an extension store.

The only difference between the UI in this and the previous version is
that extension dependencies are no longer listed. We haven't even tested
the list since redoing the look of this page, and I'd rather rethink
later on how best to really represent this. As it is now, this shouldn't
really impact anybody.

Some of the CSS for this page was brought over from Review Board as
well, helping to keep the code all in one place.
Support lessc include paths and global variables in extension packaging.

This improves extension packaging by allowing .less files to include
files relative to one of the registered static directories, and to make
use of global variables.

When building a .less file, Djblets will calculate all the main static
media directories provided by the parent project and by the extension
and add them to the less import search path. This allows an extension
to, do, say:

    @import "myapp/css/defs.less";

It also makes use of the new global variable support in LessCSS 1.5.1
to pre-define variables for .less files. BuildStaticFiles subclasses can
override get_lessc_global_vars to define the global variables available
to a .less file.

This can be used to standardize search paths in a way that works during
both runtime (using less.js) and compile time (with lessc), since those
two modes otherwise have very different search paths. For example:

    @import "@{DEFS_PATH}/mixins.css";

It can also be used to define variables used for LessCSS guards, to
separate rules for runtime vs. packaging.
Split up files in djblets.util into new apps.

djblets.util has become a dumping grounds of all sorts of random stuff.
In an effort to make things more manageable and future-proof, this
change moves out a lot of our code into new apps.

This change is backwards-compatible. The old files can still be imported
and will import the old classes and functions they provide, but will do
so with deprecation warnings. In Djblets 0.9, these will be removed.

There's also a few PyFlakes fixes I fixed while in the area.
Enable use of Django admin widgets from extension configuration pages.

The Django admin forms have some very useful widgets that one may want
to pull in. However, it also needed some additional files imported and
variables declared first. It's now possible to use these widgets.

It also makes it possible to define a Media class in a form and include
that media in any siteconfig settings page. This is a standard form
feature we just weren't supporting.

This does require a 'scripts-post' block in a base template to use this
support.
Fix ETags-based caching.

Our ETags-based caching has apparently been broken for a while. We've
been accessing an older form of the keys and not the "newer" normalized
form. This meant that our caching for review requests and other pages
weren't as effective.
Merge branch 'release-0.7.x'
Pass the extension to any middleware classes being constructed.

The new middleware support wasn't as useful without having a reference
to the extension. This is now passed to the constructor.

It's worth noting that this will break any extensions that are taking
advantage of custom middleware, but as that was introduced in the
beta, oh wells.
Add some protection in the extension resource for unloadable extensions.

The API resource for extensions would fail if the extension couldn't
actually be loaded. This was hit with the Review Board API docs build,
since we referenced non-existant extensions. We're now a bit more
careful and only introspect the extension if it's loadable.
Add better labels for the RegistrationForm.

RegistrationForm didn't provide labels for the password1, password2, or
email fields. This meant that any template that used RegistrationForm
had to in some way override the displayed labels. Now they have sensible
defaults.
Release Djblets 0.7.24.
Merge branch 'release-0.7.x'
Allow plus signs and apostrophes in usernames. Also fixed error-prone regex for
group names.

Testing Done:
All unit tests pass.

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