Use BuiltinFunction for all builtins

Replace the uses of AbstractFunction, MixedModeFunction,
SkylarkFunction and SimpleSkylarkFunction by BuiltinFunction.

--
MOS_MIGRATED_REVID=91763158
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
index 08ea8ee..af33276 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinFunction.java
@@ -205,8 +205,8 @@
     Preconditions.checkState(!isConfigured()); // must not be configured yet
     enforcedArgumentTypes = new ArrayList<>();
     this.extraArgs = SkylarkSignatureProcessor.getExtraArgs(annotation);
-    super.configure(annotation);
     this.returnType = annotation.returnType();
+    super.configure(annotation);
   }
 
   // finds the method and makes it accessible (which is needed to find it, and later to use it)
@@ -273,7 +273,10 @@
       if (type == HackHackEitherList.class) {
         type = Object.class;
       }
-      Preconditions.checkArgument(type == invokeMethod.getReturnType());
+      Class<?> methodReturnType = invokeMethod.getReturnType();
+      Preconditions.checkArgument(type == methodReturnType,
+          "signature for function %s says it returns %s but its invoke method returns %s",
+          getName(), returnType, methodReturnType);
     }
   }