Enabled `Codable` conformance for all public types (except `Board`).
This allows objects derived from `ChessKit` to be encoded/decoded for
storage or network transmission.
#### `Board` conformance to Codable
`Board` conformance will be enabled once `BoardDelegate` is removed
completely. Until then, `Board.position` and `Board.state` can be
encoded/decoded instead as a reasonable proxy.
> [!note]
Using `position`/`state` alone will lack the position count information
used to calculate threefold repetition.
* `BoardDelegate` has been deprecated and will be removed in the future
(most likely in version 1.0)
* `state` property of type `Board.State` has been added to `Board`
* After making a move on `Board`, the `state` property is updated with
an information of note, i.e. checks, checkmates, draw conditions, and
promotions
* Added command line interface for testing and exploring ChessKit
features.
* Allows user to manipulate `Board` object by making moves and viewing
the output.
* Uses `FENParser` and `SANParser` to parse inputs.
* Rewrite `PGNParser` completely to be more accurate, efficient, and
informative.
* Add `Position.Assessment` for positional assessments.
* Legacy `PGNParser.parse(game:startingWith:)` function has been
deprecated but remains available currently.
* Fix several minor issues related to move assessments and tag parsing
(even in the legacy parser).
### `PGNParser`
The new PGN parser has been rewritten from the bottom up to conform to
the [Standard: Portable Game Notation Specification and Implementation
Guide](https://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm)
(both import and export formats). PGN's are split into tag pair and
movetext sections and each is parsed separately.
Both sub-parsers (`PGNParser.TagParser` and `PGNParser.MoveTextParser`)
use an iterative multi-pass approach. The first pass (lexer) separates
out each token in the string and the second pass (parser) converts the
tokens to meaningful `ChessKit` objects (e.g. `Move`, `Game`,
`Move.Assessment`, etc.).
The PGN parser suite now throws typed `PGNParser.Error` errors whenever
an issue is encountered to explain why the parsing failed.
* Fixed en passant parsing in SANParser
* Deprecated `enPassantIsPossible` parameter in `Position` (now
initialized internally)
* Added `PositionTests` to handle cases that are not tested by
`BoardTests`
* Migrated all unit tests (except performance tests) from `XCTest` to
Swift Testing.
* Added `CustomStringConvertible` conformance to `Piece`, `Piece.Color`,
and `Piece.Kind`.