Cell magics just seem like one possible method of choosing which language to use, a menu such as what beaker uses seems alright too.
I was setting up cling (the C++ kernel) today and I gave up at realising that the interpreter is spun up in a subprocess, rather than a kernel persisted across cells. Without cross cell support, mixing languages is a limited feature of jupyter.