Support multiple zip files in a ZipFileProject.

Now that I've implemented this, I'm not sure this is how I want to handle my
current use case, so maybe I won't use this, but it doesn't weird the code too
greatly, so I'm going to leave it in there for now.
Revamp project ids, add ProjectId.

We now allow a project to have zero or more ids, instead of an optional RepoId
and optional SrcURL. It would be odd for a project to have more than one of the
same kind of id, but as long as it didn't conflict with other projects, there's
no particular problem with that.

We also resolve depends directly by ID because duh.

Lastly, we allow ProjectFinderPlugins to resolve projects by ID as well as by
root. So if someone asks for a project by ID that we've never heard of, we give
the finder plugins a chance to pony up.

This is useful for two situations: one, we can provide platform projects that
are resolved only by ID (like the JDKs), and two, we can resolve faux projects
for Maven and Ivy artifacts, which will allow them to fit in more nicely with
all the things that rely on the project dependency graph.
Add depends to info, brevify toString.
Fix issues with resolving by id. Other tidying.
Omit incidental projects from by name lookup.

Now that we turn all depends into projects, we don't want to flood the project
namespace.

This is a stopgap measure. I think the right thing to do is eliminate by name
lookup entirely and institute a full fledged workspace abstraction. Then we can
restrict ourselves to projects specifically added to your workspace, which will
be more precise and more manageable.
Split AbstractFileProject from FileProject.

This allows other projects to use AFP without inheriting name and
incidentality. Ditto for AbstractZipFileProject.
Make Project.root an abstract val.