Isopackets

Not sure if this is easier to read as individual commits (which are more or less self-contained) or as one big diff. Maybe read the commit messages first and then the full diff.

Basically, this changes how uniload works.  Instead of loading "groups of packages" (which can be mixed and matched at the uniload.load site, although they all had to be in ROOT_PACKAGES) via turning them into an in-memory "program" which is evaluated, we ensure that all possible loadable programs exist on disk at startup, and then later do the simple load (no compilation necessary, just reading and eval'ing).  These programs are called isopackets.

For released tools, the isopackets are built when the tool is built. For checkout tools, the isopackets are built at startup; they use a buildinfo.json-style file (watchSet and BUILT_BY) to figure out quickly if they need to be rebuilt.

We are also now careful to not use the PACKAGESOURCE/.build.foo directory at all during isopacket build.  This is a preliminary step for moving that directory into your app.