case insensitive #at()
constructor converts board positions to uppercase
no smart-game dependency
throw an error if deriveState() is called with an illegal move