Cleanup super handling with different names

For primitives, we should enforce a symbol to exist (using the a<>
template), since calling the primitive with the name __unknown__ doesn't
make sense. For super calls we just allow nil to be used, so we don't
have to create the __unknown__ symbol there either.

We also cleanup setting the name in super calls. After the first
initialization, this can name can never change since it always uses the
original compiled code's name. I haven't been able to create any
scenario that doesn't follow this pattern and all the specs pass.

If we ever hit a scenario in the wild where this name does change, we
can add specs based on that bug and make sure it works correctly.