Check in the majority of the prototype's code.

This is the MVP of Skyframe with merged analysis and execution. It's meant to only handle the most straightforward "happy path" of a build and is currently ignoring all failures and extra features.

RELNOTES: None
PiperOrigin-RevId: 399632160
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverKey.java
index 6cdb535..0f73f9c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverKey.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
+import java.util.Objects;
 
 /**
  * Wraps an {@link ActionLookupKey}. The evaluation of this SkyKey is the entry point of analyzing
@@ -44,4 +45,19 @@
   public SkyFunctionName functionName() {
     return SkyFunctions.BUILD_DRIVER;
   }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other instanceof BuildDriverKey) {
+      BuildDriverKey otherBuildDriverKey = (BuildDriverKey) other;
+      return actionLookupKey.equals(otherBuildDriverKey.actionLookupKey)
+          && topLevelArtifactContext.equals(otherBuildDriverKey.topLevelArtifactContext);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(actionLookupKey, topLevelArtifactContext);
+  }
 }