Do not special-case transitioning into the null configuration in DependencyResolver.

Instead, do it in ConfigurationResolver#resolveConfigurations(). This mirrors what we do in SkyframeExecutor#getConfigurations() for top-level targets.

There are also a few ancillary wins:
- There is now a precondition check that verifies that DependencyResolver#dependentNodeMap() never returns a transition with an explicit configuration at every call site
- Null source configurations are not special-cased anymore in ConfiguredTargetFunction and PostConfiguredTargetFunction

RELNOTES: None.
PiperOrigin-RevId: 237972536
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 26cf12f..a9a3852 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -508,16 +508,14 @@
 
     // Trim each dep's configuration so it only includes the fragments needed by its transitive
     // closure.
-    if (ctgValue.getConfiguration() != null) {
-      depValueNames =
-          ConfigurationResolver.resolveConfigurations(
-              env,
-              ctgValue,
-              depValueNames,
-              hostConfiguration,
-              ruleClassProvider,
-              defaultBuildOptions);
-    }
+    depValueNames =
+        ConfigurationResolver.resolveConfigurations(
+            env,
+            ctgValue,
+            depValueNames,
+            hostConfiguration,
+            ruleClassProvider,
+            defaultBuildOptions);
 
     // Return early in case packages were not loaded yet. In theory, we could start configuring
     // dependent targets in loaded packages. However, that creates an artificial sync boundary