Different ways of checking if a target is current.

Rather than the "check absolutely everything" approach until now,
this allows checking only on existance, only on code, or only on
the dependencies.  This has two uses: one is for long running
computation, perhaps that involves packages that are not easily
available.  In this case, the appropriate files/objects could be
moved into place and we'd just depend on existance.  The other is
for naturally stochastic things (simulations, etc) where it might
be reasonable not to check for changes to the object.

There is no support (yet) for specifying this level in any meaningful way.
Per-target support for checking currentness.

Each target may contain a key "check" which may take one of the
values "all" (default), "code", "depends" or "exists".  This should
probably be used sparingly, but see the previous commit for cases
where this might be useful