Rework Job as a cached-data container with some mutators.

This is one step to building a web dashboard for ArchiveBot.

I decided to do this because a dashboard is going to require most of the
Redis data for a job, and multiple HGETs is much less efficient than one
(larger but less per-command latency) HGETALL.

Neat side effect: LogAnalyzer is WAY shorter.  It is a bit less
efficient in terms of Redis queries, but we'll just have to see how bad
that really is.  I suspect the answer is "not at all".
Job query console.
Lock JSON.
Move json into the dashboard group.

It's not used by the bot proper.
Fix syntax error; don't analyze jobs that can't be found.
Web dashboard skeleton.
Use sorted sets for archive job logs.

Although insertion is slower, the error analysis process needs to pull a
range of log entries.  With lists, this can be (and often is) O(n),
where n is the number of entries in the list.  With sorted sets, it's
O(log(n)+m), where n is the number of entries in the set and m is the
number of elements that will be considered.  (Usually, n >>> m.)

This commit also eliminates the Lua-based URL categorization, because
it's no longer needed.
Send log entries to the dashboard.