Add a hook for registering custom datagrid columns.

DataGrid now has a more formal column registration and defaults setup.
Instead of scanning all columns at instance creation time and populating
some defaults, it now does this once per class. This lets us get rid of
some of our variables and to store less state in memory.

The new DataGridColumnsHook allows extensions to register custom columns
into any DataGrid. This takes care of both registering and unregistering
them.
Allow static media bundles to apply to certain URLs.

We previously only had one special type of static media bundle: "default".
This would appear on all pages. Extensions wanting finer page control
would have to use a TemplateHook with a set of URL names and a template
for loading the bundles, which was annoying and inefficient.

Now, static bundles can have an "apply_to" field containing a list of
URL names. When rendering default static bundles for a page, all bundles
matching that page's URL name will be included.
Simplify TemplateHook and create a mixin for applies_to functionality.

TemplateHook did some hard work in order to figure out the URL name to
match for applies_to. Turns out that Django provides the URL name for
us, through request.resolver_match.url_name. Since this is more
reliable, we can use this directly.

The applies_to support is pretty handy, and even though it's now
simpler, it's best not to have to re-implement it. This change pulls it
out into a mixin that can be easily used by other hooks.
Fix matching URL names when looking up bundles.

My change for displaying the static bundles left out a change that was
sitting in my tree, causing an invalid variable issue. This adds that
missing part of my change.
Fix get_url_params_except and augment_queryset.

My get_url_params_except method forgot to return the value, which meant that
we'd often see "None" in the URL parameters. I've also changed things a bit to
avoid adding empty query parameters when this method returns nothing.

This also fixes the datagrids code to always call Columns' augment_queryset()
methods. By adding a query string like ?sort=people (which is a non-sortable
column), one could drop the datagrid through a code path where it wouldn't call
augment_queryset, leading to bizarre error messages like this:

    'ReviewRequest' object has no attribute 'draft_summary'

This change fixes that up, fixes the obsolete docstring for
post_process_queryset.

Testing done:
Played with a bunch of different sort parameters on various datagrids,
including adding query strings that included non-sortable columns.

Fixes bug 2565.

Reviewed at https://reviews.reviewboard.org/r/5373/