Prototypes with typeclasses

This branch has a few additional random optimisations than specifically prototypes for datatypes and typeclasses, but here it is anyway.

- Prototypes for data types
- Prototypes for typeclasses
- No empty `__superclasses` anymore
- Typeclass objects now have the superclasses as direct properties rather than stored inside a `__superclasses` object
- Applications like `f({})` to force thunks are now inlined to just be regular javascript `f()` calls.
Yes, but we're not matching on a PS `Ident` here, this is JavaScript. I'm just worried it could get generated in another way. Maybe not now, but in future. I mean, UnderscoreJS uses this for example - if we started inlining FFI calls later, this could break.

What if we added a new constant, like `__unused` or something, and matched on that?