Register builtins with Runtime

This covers all builtins in classes that use SkylarkSignatureProcessor#configureSkylarkFunctions. Generally this means things you define with @SkylarkSignature.

It is now an error to call configureSkylarkFunctions multiple times for the same class. It should only be called in static initializers.

Runtime's static knowledge of builtins has been factored into Runtime.BuiltinRegistry.

RELNOTES: None
PiperOrigin-RevId: 178295926
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index 2acfb21..833b20a 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -616,7 +616,7 @@
     Location location = call.getLocation();
     Object value = positionals.get(0);
     ImmutableList<Object> positionalArgs = positionals.subList(1, positionals.size());
-    BaseFunction function = Runtime.getFunction(EvalUtils.getSkylarkType(value.getClass()), method);
+    BaseFunction function = Runtime.getBuiltinRegistry().getFunction(value.getClass(), method);
     Object fieldValue =
         (value instanceof ClassObject) ? ((ClassObject) value).getValue(method) : null;
     if (function != null) {