Add an actions provider for testing Skylark rules.

The new provider gathers actions generated by any Skylark-based RuleConfiguredTarget, so long as the rule definition has _skylark_test=True set. For the moment this flag is under the user's control, but the intention is that it will be set by a test runner.

--
MOS_MIGRATED_REVID=134687396
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index 53aabfa..9fcb2c4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -476,6 +476,7 @@
     private String name;
     private final RuleClassType type;
     private final boolean skylark;
+    private boolean skylarkTestable = false;
     private boolean documented;
     private boolean publicByDefault = false;
     private boolean binaryOutput = true;
@@ -589,6 +590,7 @@
           name,
           skylark,
           skylarkExecutable,
+          skylarkTestable,
           documented,
           publicByDefault,
           binaryOutput,
@@ -662,6 +664,12 @@
       return this;
     }
 
+    public Builder setSkylarkTestable() {
+      Preconditions.checkState(skylark, "Cannot set skylarkTestable on a non-Skylark rule");
+      skylarkTestable = true;
+      return this;
+    }
+
     /**
      * Sets the policy for the case where the configuration is missing required fragments (see
      * {@link #requiresConfigurationFragments}).
@@ -953,6 +961,7 @@
 
   private final boolean isSkylark;
   private final boolean skylarkExecutable;
+  private final boolean skylarkTestable;
   private final boolean documented;
   private final boolean publicByDefault;
   private final boolean binaryOutput;
@@ -1063,6 +1072,7 @@
       String name,
       boolean isSkylark,
       boolean skylarkExecutable,
+      boolean skylarkTestable,
       boolean documented,
       boolean publicByDefault,
       boolean binaryOutput,
@@ -1086,6 +1096,7 @@
     this.isSkylark = isSkylark;
     this.targetKind = name + " rule";
     this.skylarkExecutable = skylarkExecutable;
+    this.skylarkTestable = skylarkTestable;
     this.documented = documented;
     this.publicByDefault = publicByDefault;
     this.binaryOutput = binaryOutput;
@@ -1886,7 +1897,7 @@
     return ruleDefinitionEnvironmentHashCode;
   }
 
-  /** Returns true if this RuleClass is a skylark-defined RuleClass. */
+  /** Returns true if this RuleClass is a Skylark-defined RuleClass. */
   public boolean isSkylark() {
     return isSkylark;
   }
@@ -1900,6 +1911,14 @@
   }
 
   /**
+   * Returns true if this RuleClass is Skylark-defined and is subject to analysis-time
+   * tests.
+   */
+  public boolean isSkylarkTestable() {
+    return skylarkTestable;
+  }
+
+  /**
    * Returns true if this rule class outputs a default executable for every rule.
    */
   public boolean outputsDefaultExecutable() {