Optimises Adjacency List
Catches out of memory error if Graph is at edge of memory

If the Graph was only just able to be created, generating the
topologically sorted graph will result in an out of memory error
Refactors who moves first when game starts

Moves all logic that decides who moves first when the game starts into
its own method for readability purposes