When building on the CI, there are some race conditions that occur
periodically to write files to disk. This is because the extensions are
built separately for their own projects and for when they are being
included in the CLI. This change sets a custom OutDir and
IntermediateOutputPath when needed so there are separate places these
get written.
This removes most of the web-specific info to a separate extension so that it can have web-related things co-located with it. The analyzers/codefixers are not self-contained, but that may require a bit more thinking as we distribute them. This is a first step towards organizing extensions by technology areas.
The resulting output looks like this:
```
upgrade-assistant
|- Microsoft.DotNet.UpgradeAssistant.Cli.dll
|- ....
|- extensions
|- default
|- [files]
|- web
|- [files]
```
This seems to be causing problems with the way we're building our
extensions. Somehow it's detecting that we have a version when no
PackageReferences do. Since this is a preview feature, it appears we may
have hit a bug with that. For now, swapping back to non-centrally
managed versions allows for a more seamless inner dev-loop.
If an extension contains multiple assemblies, they will now resolve from within the extension thanks to a private load context. We want to ensure that we don't load a different version of anything the default context loads, so this checks for that as well.