Some messing around with super
Rework extend to accept a proto function that closes over the base class (for calling `super` methods) and returns a proto object to be defined on the new object