task: Don't do as much work if a task hasn't changed
Implement new model for ostbuild

At a high level, this kills off JsonDB and makes build IDs consistent
across all tasks.

The details are that this implements a new scheme for how tasks are run
and how the autobuilder and task manager manage tasks: each build has
its own directory where results are compiled, and tasks are run inside
these build directories.

The autobuilder makes build directories speculatively based on a trigger,
runs a resolve, and then kicks off the rest of the build process. If the
resolve returns that nothing has changed, then the build directory is
deleted so we don't waste directories.

The details of what each task is working is tracked by a series of symbolic
links in a new toplevel directory, 'tasks': when a task starts, it takes the
realpath of these, and when a task finishes, the task manager updates the
symlinks for the tasks that follow.

This symlink adjusting scheme ensures that if we have a heavy task, like
builddisks, we don't run it for every possible build, but only the latest
build finished when the current builddisks finishes.

Soon, I expect to add a status.json for a build that details the overall
state of the build (in-progress, success, failed) and the status of every
task that has run on it.

I also want to add symbolic links in a new toplevel directory, 'results',
that provide a convenient way to get the latest successful build or the
latest failed build, etc.