Add extension API for dropping and reopening reviews

Implement using a new command added in cli.py.  Also reimplement the
existing API for closing reviews using cli.py, and add a helper function
for using cli.py at all.

This is primarily done in preparation for changes that make closing,
dropping and reopening reviews more complex operations than simply updating
the 'state' column in the 'reviews table.
Add mechanism for automatic "archiving" of inactive review branches

Definitions:

 - archive branch: delete the branch ref from the repository while adding
                   a keep-alive ref such that the commits on the branch
                   are still kept alive
 - resurrect branch: restore a previously archived branch to point at the
                     commit it pointed at when it was archived
 - inactive review branch: branch belonging to a closed or dropped review

The mechanism works as follows:

When a review is closed or dropped, we schedule archiving of the review
branch.  The actual archiving is done by the maintenance task, at around
the same time as it runs a maintenance GC on repositories.

The archiving is scheduled at a (per-user and per-repository) configurable
number of full days after the review was closed or dropped.  There's a
different delay for closed and dropped reviews; the former defaults to
7 days and the latter to 1 day.

If a closed or dropped review is reopened, its branch is automatically
resurrected.

In addition, review branches can be manually resurrected from the review
front-page.  If a review branch is manually resurrected, another archiving
of it will be scheduled after the usual delay.

Finally, a migration script schedules archiving of branches belonging to
already closed or dropped reviews, at a random point in time between two
and six weeks into the future.