more specifically than minimax, this is an implmentation of minimax with alpha-beta pruning, meaning we can truncate recursive minimax calls
early if we know that the game path is better for the opponent (or worse for us) than a previously found move. this would be much cooler if the game
was more complex than just 3x3 tic-tac-toe - with so few moves, any interesting adjustments that i could make (for example, searching only to specific
depths and using some heuristic to score the resulting positions) end up being not very useful.