I sympathize with this, but (a) I do not know of a single example where this would be needed, and (b) it is not possible with a library-only extension. I think these are strong arguments in favor of having Invariance and not the others.
They also play a somewhat different role, so why it seems there is a symmetry being broken here, that is not really the case. When defining a type equipped with extra invariants for the purpose of unsafe code, you have a proof obligation to show that the invariant respects the variance(s) of the type parameters. Adding Invariant is a way to remove (or weaken) proof obligations. In contrast, adding Covariant would be adding a proof obligation.
It’s a bit like how we can make a type non-Copy by not doing impl Copy, but we cannot “force” a type to be Copy. We can opt-out of extra properties, but we don’t have a way to claim extra properties that are in contradiction with what the compiler inferred.
I cannot imagine how seeing a &'a mut &'a () in something like this is going to teach someone an intuitive notion of the concept of invariance, to the extent that they will be able to understand why this is needed here. In contrast, with a more explicit marker like Invarinace, they can go read the docs for that type which will teach them what this is and why it is needed. So having a more explicit type is IMO better for reading the code even for people that haven’t understood the concept of (in)variance yet.
And it is certainly better for people that are experienced enough to be able to write or review that kind of code, which arguably is at least as important of a audience for this code than less experienced developers reading very advanced code with the goal of understanding it better. (I’d argue a guide is better suited for teaching such concepts than just diving into some crazy complicated examples.) In fact, that code already uses the notion of invariance to explain what is going on. People writing such code already think in these terms, we just currently don’t offer them the right vocabulary.
Notice than an understanding of variance is requried for some kinds of unsafe code, and we cannot work around that by pretending it isn’t the case. There’s a reason that the Nomicon has a long section on this topic. Complex topics don’t become easier by sweeping them under the rug.