Add `Matchable` trait

I think this will always be true of restricting the languages top type. In the short view, the same thing could be achieved by warnings, a weaker top type on the other hand is a long term solution.

A Matchable trait also seems less like a hack than @unchecked warnings to me.

I wrote about this before here:

Disallowing (via compiler warnings or errors) downcasting to an opaque type makes a lot of sense regardless what it’s upper bound is. This is already the case as of PR #10664.

The issue is the other direction: Someone using something Boxish as a Box or a Foo as an X.
I don’t think there’s a good solution to this, thought I’d be happy if someone proved me wrong. It would be a problem regardless, and it’s good enough that you’re “safe” as long as you don’t have a subtype of Matchable as the upper bound on the opaque type.