The Polling Problem
Coroutines and Messages as the core of an language, or at least your architecture, to help avoid the polling problem. The heuristic is that if you avoid the polling problem, it become much easier to create interacting concurrent processes in a scalable manner. I believe that this is the true difficulty in making AI for games. I have since implemented a solution in C# that does not require a pre-processor.