Encode Java method names uniquely

These commits encode Java method names with types instead of arities, e.g. foo([BLjava.lang.String;) instead of foo/2.
Also reduces the amount of reflection.

The new multimethod for extracting names may need to be extended to cover other cases.