There are a lot of ingredients that might or might not go into the winning formula that brings concurrent programming to the mainstream. This is a very brief run-through of as many as I can think of.
Tim Bray writes about some aspects of Functional Programming and how they contribute to solve the concurrency problem.