Reintroduce some limited synchronization for configuration resolution This ensures that only one thread is resolving the graph of a given configuration at a time.
When we step over to other projects while resolving configurations, we will release the current project lock. This can allow other tasks to start running. When they do, there can be issues when they try to continue resolving the graph of the same configuration as the first task. For example, a beforeResolve hook can cause the project lock to be released (perhaps by resolving another configuration) and then another task can put the configuration in an unexpected state before the project lock can be reacquired..