introduced candidate moves
use candidate moves for check detection
introducted GameContext.attempt() instead of .copy()