bazel syntax: assert validity of results from Java calls

Other than legal Starlark values, the implicit conversion to Starlark
now accepts only null, List, and Map.

- make Attribute.{Computed,LateBound}Default implement StarlarkValue
- move SkylarkType.convertToSkylark to Starlark.fromJava.
- move SkylarkType.isSkylarkAcceptable to Starlark.valid.
- move support for legacy implicit NestedSet conversion to MethodDescriptor.
  I was hoping to delete this but there are still a dozen or so clients to fix.

PiperOrigin-RevId: 281382879
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 902e964..6b8bb04 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -146,7 +146,7 @@
     public void value() {}
     @SkylarkCallable(name = "return_bad", documented = false)
     public Bad returnBad() {
-      return new Bad();
+      return new Bad(); // not a legal Starlark value
     }
     @SkylarkCallable(name = "struct_field", documented = false, structField = true)
     public String structField() {
@@ -520,7 +520,8 @@
     public Object getValue(String name) {
       switch (name) {
         case "field": return "a";
-        case "nset": return NestedSetBuilder.stableOrder().build();
+        case "nset":
+          return NestedSetBuilder.stableOrder().build(); // not a legal Starlark value
         default: return null;
       }
     }
@@ -1457,11 +1458,15 @@
   }
 
   @Test
-  public void testJavaFunctionReturnsMutableObject() throws Exception {
-    new SkylarkTest()
-        .update("mock", new Mock())
-        .testIfExactError(
-            "method 'return_bad' returns an object of invalid type Bad", "mock.return_bad()");
+  public void testJavaFunctionReturnsIllegalValue() throws Exception {
+    update("mock", new Mock());
+    IllegalArgumentException e =
+        assertThrows(IllegalArgumentException.class, () -> eval("mock.return_bad()"));
+    assertThat(e)
+        .hasMessageThat()
+        .contains(
+            "cannot expose internal type to Starlark: class"
+                + " com.google.devtools.build.lib.syntax.SkylarkEvaluationTest$Bad");
   }
 
   @Test
@@ -1501,10 +1506,15 @@
   }
 
   @Test
-  public void testClassObjectCannotAccessNestedSet() throws Exception {
-    new SkylarkTest()
-        .update("mock", new MockClassObject())
-        .testIfErrorContains("internal error: type 'NestedSet' is not allowed", "v = mock.nset");
+  public void testFieldReturnsNestedSet() throws Exception {
+    update("mock", new MockClassObject());
+    IllegalArgumentException e =
+        assertThrows(IllegalArgumentException.class, () -> eval("mock.nset"));
+    assertThat(e)
+        .hasMessageThat()
+        .contains(
+            "cannot expose internal type to Starlark: class"
+                + " com.google.devtools.build.lib.collect.nestedset.NestedSet");
   }
 
   @Test