Improved checks for unique / valid player / ship names

* Different error messages for player / ship name empty or already taken
* Changed how addUser and addShip returns errors (returning a custom error object that can be identified as error object by its property `isError`)
* New methods getPlayerByName() and getShipByName() that are used to check if player / ship already exists