I previously sketched out the idea of "variance bounds" here. But it's not a unique idea; Niko's blog post has a version of it, for example ("for<'a> LendingIterator<Item<'a> = U>
"). I didn't go into much detail here, because even alternative schemes will probably need something like it.