Trait based inheritance

This is largely based upon #9 and #91, but fleshed out to make an actual inheritance proposal.
So that contracts are explicit and type signatures actually mean something. If we allow dynamically casting any abstract type to any other type, then a function requiring `T: 'static` could do just about literally *anything* (see above `evil_id`). It should be possible to *know* that a generic function only manipulates its type parameters in accordance with the trait bounds which it specifies. I don't know how else to rephrase this to make it clear why this is desirable.