Dan Robinson pointed out a hackish way you could get this without a protocol change.
A contract could store a large table of “contract signatures”. Any contract can call it and write a message on it, and pass around a handle to that message. It’s clunky and requires a bunch of callbacks but it works.
To be clear, I don’t recommend this approach, just good to know it’s a possibility.