You’re doing them a disservice if you don’t eventually have them use C/C++/Fortran with both MPI and OpenMP for message passing and SMP. My personal opinion on teaching programming concepts, however, is that you remain language neutral for as long as possible. You can teach the message passing concepts and shared memory programming without clouding the main ideas with syntactical sugar. Once the basics are in place and they understand the nuances between message passing and shared memory, you can introduce the actual software tools that can make this happen. Once these concepts take hold, you can introduce them to hybrid MPI/OpenMP, GPGPU, and PGAS concepts. Two non-mainstream languages that I can suggest are Cray’s Chapel; it’s very interesting, particularly if you wish to study the “compiler” and runtime. Another language that I really adore is an open source language called Qore. It’s a scripting language built with SMP scalability in mind.
Also, “Shared Memory Consistency Models: A Tutorial”, IEEE Computer, 29(12), pp.66-76, December 1996 is a nice introduction for the topic of memory models in shared memory programming.