Strictly enforce reverse deps removals.

Now that we don't clean the graph during catastrophes, we should be crashing hard in these cases.

--
MOS_MIGRATED_REVID=102785226
diff --git a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java
index 26f1136..807aa8c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java
@@ -106,23 +106,29 @@
     }
   }
 
+  boolean reverseDepsIsEmpty(T container) {
+    return !isSingleReverseDep(container)
+        && ((List<SkyKey>) getReverseDepsObject(container)).isEmpty();
+  }
+
   /**
    * See {@code addReverseDeps} method.
    */
   void removeReverseDep(T container, SkyKey reverseDep) {
     if (isSingleReverseDep(container)) {
       // This removal is cheap so let's do it and not keep it in reverseDepsToRemove.
-      // !equals should only happen in case of catastrophe.
-      if (getReverseDepsObject(container).equals(reverseDep)) {
+      Preconditions.checkState(
+          getReverseDepsObject(container).equals(reverseDep),
+          "toRemove: %s container: %s",
+          reverseDep,
+          container);
         overwriteReverseDepsList(container, ImmutableList.<SkyKey>of());
-      }
       return;
     }
     @SuppressWarnings("unchecked")
     List<SkyKey> reverseDepsAsList = (List<SkyKey>) getReverseDepsObject(container);
-    if (reverseDepsAsList.isEmpty()) {
-      return;
-    }
+    Preconditions.checkState(
+        !reverseDepsAsList.isEmpty(), "toRemove: %s container: %s", reverseDep, container);
     List<SkyKey> reverseDepsToRemove = getReverseDepsToRemove(container);
     if (reverseDepsToRemove == null) {
       reverseDepsToRemove = Lists.newArrayListWithExpectedSize(1);