New predicate system for AI move queuing

Moves can now be queued by an AI battler which will only be used if
specified conditions are met at the time the move is about to be used.
If only conditional moves are queued and none satisfy their predicates,
the move selection function is called again.  Still not totally happy
with this system to be honest (it's a bit clunky to manage); the AI
engine could really use an overhaul.