Early draft

I'm not suggesting that we merge any of this but a PR makes it easier to discuss.
Since most of the cases does the same thing here, can this be tidied up? Is this what you are planning to use covariant types for?