Add ExecGroupCollection and ExecGroupContext objects to starlark for ctx.exec_groups[<exec_group>] and ctx.exec_groups[<exec_group>].toolchains[<toolchain_type>] access respectively

WANT_LGTM=all
PiperOrigin-RevId: 307697565
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java
index 8274d83..2cbe240 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java
@@ -26,11 +26,14 @@
 /**
  * A wrapper class for a map of exec_group names to their relevent ToolchainContext.
  *
- * @param <T> any class that extends ToolchainCollection so this can be used, e.g., both before and
- *     after toolchain resolution.
+ * @param <T> any class that extends ToolchainContext. This generic allows ToolchainCollection to be
+ *     used, e.g., both before and after toolchain resolution.
  */
 public class ToolchainCollection<T extends ToolchainContext> {
-  @VisibleForTesting public static final String DEFAULT_EXEC_GROUP_NAME = "default_exec_group";
+
+  // This is intentionally a string that would fail {@code Identifier.isValid} so that
+  // users can't create a group with the same name.
+  @VisibleForTesting public static final String DEFAULT_EXEC_GROUP_NAME = "default-exec-group";
 
   /** A map of execution group names to toolchain contexts. */
   private final ImmutableMap<String, T> toolchainContexts;
@@ -40,6 +43,10 @@
     toolchainContexts = ImmutableMap.copyOf(contexts);
   }
 
+  ToolchainCollection(ToolchainCollection<T> toCopy) {
+    toolchainContexts = ImmutableMap.copyOf(toCopy.getContextMap());
+  }
+
   /** Builder for ToolchainCollection. */
   public static class Builder<T extends ToolchainContext> {
     private final Map<String, T> toolchainContexts = new HashMap<>();
@@ -62,7 +69,7 @@
     }
   }
 
-  public T getDefaultToolchainContext() {
+  T getDefaultToolchainContext() {
     return toolchainContexts.get(DEFAULT_EXEC_GROUP_NAME);
   }
 
@@ -76,6 +83,10 @@
         .collect(toImmutableSet());
   }
 
+  ImmutableSet<String> getExecGroups() {
+    return toolchainContexts.keySet();
+  }
+
   public ToolchainCollection<ToolchainContext> asToolchainContexts() {
     return new ToolchainCollection<>(ImmutableMap.copyOf(toolchainContexts));
   }