Calculate task graphs for all included builds before commencing execution
This change allows us to determine more of the required tasks up-front, rather
than relying on discovery of these tasks during build execution. For example,
transitive `compileOnly` dependencies will now be determined prior to
executing tasks in any build.
In doing so, we greatly reduce the number of cases where a build may
be executed twice in a single invocation. This is largely now limited
to:
- An included build producing a plugin artifact as well as an artifact
required as a task input
- An included build that provides 2 outputs, one that is resolved at
configuration time and another as a regular task input
- Using the IDE generation tasks combined with another task that uses
an included build output.