Better dependency handling.

We let the ProjectModel compute a given project's complete transitive
dependencies and then store all of those for a given project. Then when
querying, query all of the transitively depended projects but we don't allow
them to in turn query their own depends. Each project has its own view of the
dependency graph that only makes sense for that project.