If I understand correctly, we don't really need a `JSONSessionStorage` -- just modify `SessionStorage` to do what it would do, that would work with pickling as well.
But this, in itself, is less than optimal -- it requires contrib.messages to go through unnecessary hoops when being stored as a pickle.
I suggest, instead, to add an API on contrib.session to retrieve a "serialization method" -- a string defined by the session storage engine, with current values being "json" and "pickle". Then, the code in contrib.messages.storage.session could use that to pick the serialization method it uses, and there's no need to choose your session serializer based on whether or not you use messages, nor change your message settings based on your session storage.
This would require 3rd-party apps to adapt themselves for JSON storage in case they use the session in non-trivial ways. I am not sure this is such a bad idea. The non-backward-compatibility introduced in 1.6 would be "if an app saves to session something non-JSONable and you save sessions in cookies, things break by default" -- and there's no easy "external" way to work around it.
So perhaps this idea can somehow be merged with some notion of hooks, but I think it is better even without them.