Add detailed exit code to CommandCompleteEvent, and make sure that crash failure details from the throwable triggering the crash are added.

PiperOrigin-RevId: 305885101
diff --git a/src/main/java/com/google/devtools/build/lib/util/DetailedExitCode.java b/src/main/java/com/google/devtools/build/lib/util/DetailedExitCode.java
index 6e43c3b..ebc0c95 100644
--- a/src/main/java/com/google/devtools/build/lib/util/DetailedExitCode.java
+++ b/src/main/java/com/google/devtools/build/lib/util/DetailedExitCode.java
@@ -24,6 +24,7 @@
 import com.google.protobuf.MessageOrBuilder;
 import java.util.Comparator;
 import java.util.Map;
+import java.util.Objects;
 import javax.annotation.Nullable;
 
 /** An {@link ExitCode} and an optional {@link FailureDetail}. */
@@ -101,6 +102,24 @@
   }
 
   @Override
+  public int hashCode() {
+    return Objects.hash(exitCode, failureDetail);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj == this) {
+      return true;
+    }
+    if (!(obj instanceof DetailedExitCode)) {
+      return false;
+    }
+    DetailedExitCode that = (DetailedExitCode) obj;
+    return this.exitCode.equals(that.exitCode)
+        && Objects.equals(this.failureDetail, that.failureDetail);
+  }
+
+  @Override
   public String toString() {
     return String.format(
         "DetailedExitCode{exitCode=%s, failureDetail=%s}", exitCode, failureDetail);