Encoding Interface Update

Updated the Encoding interface -- changing the first parameter of the Decoder method from a std::vector<CodePoint> & to a CodePoint & -- greatly simplifying the implementation of the Decode method (and incidentally simplifying the implementation of the Decoder methods on the concrete subclasses), and also making it possible to implement a streaming decoder without unnecessary heap allocations (to create dummy vectors) going forward.
UTF8 Cleanup

Did some cleaning up in the utf8.cpp file:

- Corrected a typo in a comment
- Used std::nullopt instead of a full, default constructed std::optional when early returning a disengaged std::optional
UTF8 Tweak/Fix

Previously when the UTF-8 decoder encountered a non-continuation byte in a multi-byte sequence, it would consume that non-continuation byte and report an error.  This could lead to perfectly acceptable code units being removed from the stream because they were preceded by a malformed sequence.  Corrected this so that if a code unit is found not to be a continuation byte, the stream is rewound before returning.
Style Changes

Made style changes/corrections in utf8.hpp, utf16.hpp, and utf32.hpp.
Invalid Unicode Update

Added U+FFFE (reversed BOM) and U+FFFF as invalid code points to CodePoint::IsValid.
UTF16 Fix

Fixed a bug which would cause the UTF-16 decoder to erroneously consume code units when it encountered a lead surrogate without a trail surrogate.
Encoding Fix

Fixed an issue in the way Encoding::Decode handled EncodingErrorType::UnexpectedEnd errors.

The correct behaviour is to end the decoding immediately, after taking whatever action was specified.  However, this case was not detected correctly, and accordingly decoding would continue after the error (unless the action for unexpected end was to throw), resulting -- in some cases -- in EncodingErrorType::Strict being raised.
UTF8 Decoding Unit Tests

Added unit tests for the UTF-8 decoder.
CodePoint::IsValid Overhaul

Rewrote the CodePoint::IsValid method.  In addition to the code points it previously identified as invalid, it now detects:

- The two non-characters at the end of each block
- The contiguous range of non-characters U+FDD0..U+FDEF
CodePoint Unit Tests

Added unit tests for the CodePoint::IsValid and CodePoint::IsWhiteSpace methods.
Encoding Error Handling

Added error checking/handling to the Encoding::Encode method.
ByteOrderMark Default Constructor

Added a default constructor to the ByteOrderMark class, which is defaulted.  Simply creates a BOM containing zero bytes.
ASCII

Added the ASCII class, a subclass of Encoding, which encodes/decodes ASCII strings.