Re-implement variables in the blaze query language. Instead of using a mutable global context of variable bindings, pass around immutable local contexts.

The motivation is so we can safely evaluate all blaze query expressions concurrently under the hood. A global context is hostile to this goal.

--
MOS_MIGRATED_REVID=127324600
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 1546b4e..586c493 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -65,6 +65,7 @@
 import com.google.devtools.build.lib.query2.engine.StreamableQueryEnvironment;
 import com.google.devtools.build.lib.query2.engine.TargetLiteral;
 import com.google.devtools.build.lib.query2.engine.Uniquifier;
+import com.google.devtools.build.lib.query2.engine.VariableContext;
 import com.google.devtools.build.lib.skyframe.BlacklistedPackagePrefixesValue;
 import com.google.devtools.build.lib.skyframe.ContainingPackageLookupFunction;
 import com.google.devtools.build.lib.skyframe.FileValue;
@@ -320,9 +321,10 @@
     try (final AutoProfiler p = AutoProfiler.logged("evaluating query", LOG)) {
       try {
         if (expr.canEvalConcurrently()) {
-          expr.evalConcurrently(this, callbackWithEmptyCheck, threadPool);
+          expr.evalConcurrently(
+              this, VariableContext.<Target>empty(), callbackWithEmptyCheck, threadPool);
         } else {
-          expr.eval(this, callbackWithEmptyCheck);
+          expr.eval(this, VariableContext.<Target>empty(), callbackWithEmptyCheck);
         }
       } catch (QueryException e) {
         throw new QueryException(e, expr);
@@ -487,9 +489,9 @@
   }
 
   @Override
-  public void eval(QueryExpression expr, Callback<Target> callback)
+  public void eval(QueryExpression expr, VariableContext<Target> context, Callback<Target> callback)
       throws QueryException, InterruptedException {
-    expr.eval(this, callback);
+    expr.eval(this, context, callback);
   }
 
   @Override
@@ -979,10 +981,11 @@
   public void getAllRdeps(
       QueryExpression expression,
       Predicate<Target> universe,
-      final Callback<Target> callback,
-      final int depth)
+      VariableContext<Target> context,
+      Callback<Target> callback,
+      int depth)
       throws QueryException, InterruptedException {
-    getAllRdeps(expression, universe, callback, depth, BATCH_CALLBACK_SIZE);
+    getAllRdeps(expression, universe, context, callback, depth, BATCH_CALLBACK_SIZE);
   }
 
   /**
@@ -994,13 +997,17 @@
   @VisibleForTesting
   protected void getAllRdeps(
       QueryExpression expression,
-      final Predicate<Target> universe,
-      final Callback<Target> callback,
-      final int depth,
-      final int batchSize)
+      Predicate<Target> universe,
+      VariableContext<Target> context,
+      Callback<Target> callback,
+      int depth,
+      int batchSize)
       throws QueryException, InterruptedException {
     Uniquifier<Target> uniquifier = createUniquifier();
-    eval(expression, new BatchAllRdepsCallback(uniquifier, universe, callback, depth, batchSize));
+    eval(
+        expression,
+        context,
+        new BatchAllRdepsCallback(uniquifier, universe, callback, depth, batchSize));
   }
 
   private class BatchAllRdepsCallback implements Callback<Target> {