Refactor AddPiece

Normally we want to add an entirely new piece (a new implementation of IPiece) so enforce this by making AddPiece(IPiece) private, and only allowing AddPiece(type, location)