Refactor object-safety into its own (cached) module so that we can check it more easily.
Move the `upcast` routine into traits and use it for method selection
move get_method_index into traits and give it a better name (`get_vtable_index_of_object_method`)
Extend object safety to cover sized types as well as static methods.
This makes it sufficient so that we can always ensure that `Foo : Foo`
holds for any trait `Foo`.
Ensure that, every trait `Foo`, the predicate `Foo : Foo` holds.