Use urlparse.parse_qs() to parse query string

This should be more reliable than the old version Request.getParameter().
In particular, the old version didn't work correctly for parameter names
with non-alphanumeric characters in them.
Execute __init__.py files under testing/tests/ before running tests

Specifically, before running a test A/B/C.py, execute first A/__init__.py
and then A/B/__init__.py in the same scope as A/B/C.py will eventually be
executed.  Missing __init__.py files are ignored.

This allows code sharing within groups of related tests without needing
to extend the basic testing framework.
Add |reviewers| and |watchers| attributes on api.review.Review
Add api.branch.fetchAll() function

Can be used to fetch Branch objects for all branches, or all branches in
a given repository.
Add api.user.fetchAll() function and api.user.User.status attribute

The fetchAll() function can be used to fetch User objects for all users
in the system, or all users with a given status.
Rename api.commit.Commit.UserAndTimestamp.fullname attribute 'name'

There's no other name in this context, and just 'name' matches the Git
naming better, since this name comes from the Git configuration setting
user.name, and the 'email' attribute comes from the Git configuration
setting user.email.
Fix accessing api.repository.Repository.url attribute as anonymous user

Or rather, if there is no critic.effective_user, use the anonymous user
internally to look up the URL format setting, instead of crashing.
Add license header to files under src/api/
Fix infinite loop in api.commitset.CommitSet.date_ordered

If the sorting function encountered the sequence of commits A-B-X where
A is the parent of B is the parent of X, and X's commit timestamp is
earlier than both A and B, it would get stuck forever alternating between
trying to emit A and B (only) failing A since B hasn't been emitted and
failing B since X hasn't been emitted.

Also extend the unit test slightly to trigger this situation.
Add api.review.fetchAll() function

Can be used to fetch Review objects for all reviews, or all reviews in
a given repository and/or in a given state.

Also add |state| and |repository| attributes on Review objects.
Clean up api.user error handling somewhat

- When calling api.user.fetch() with invalid arguments, raise singular
  exceptions instead of the plural exceptions that api.user.fetchMany()
  raises.  The new singular exceptions are sub-classes of the plural
  exceptions, mostly with a slightly more accurate message.

- Assert that the |status| argument to api.user.fetchAll() is valid
  instead of raising a proper exception when it's not.

  The policy here (and in the rest of the API) is that asserts are used
  to validate input when the calling code is broken if the value isn't
  valid, whereas proper exceptions are raised when the calling code can't
  be expected to know if the value is valid or not without trying.
Add (partial) JSON API

The API is rooted at /api/v1 and is currently quite limited in
scope, handling only these (top-level) resources:

  /api/v1/users
  /api/v1/repositories
  /api/v1/branches
  /api/v1/commits
  /api/v1/reviews

The /api/v1/reviews end-point in particular currently provides access
only to a very limited set of information about each review.

The API is somewhat self-documenting.  This documentation is available
at <URL:http://hostname/api/v1> on any Critic system upgraded to this
commit.