cpp: Update Boost.Endian and simplify VariantPixelBuffer

- Updated Boost.Endian with current git master; this adds native endian float types
- Added helper functions to do byteswapping with Boost.Endian, including complex float types
- `VariantPixelBuffer` refactored to remove big/little/native endian specialisations; nothing was intrinsically wrong with it, but the extra complexity was causing problems with some linkers, and would undoubtedly make the Windows linker explode, and it also bloated the symbol table due to the long type names

VariantPixelBuffer is now only specialised to hold `PixelBuffer<T>`, where `T` are native numeric types.  This means that readers and writers will need to be responsible for converting data to and from the native form as needed.  `FormatReader::readPlane` updated to byteswap the entire PixelBuffer after a plane read of non-native endian type, and the tests have been updated accordingly.

Comparison of the change:

```
Property          Before    After    Using
Library size      30868943  7771248  ls -l
Exported symbols     28936    12441  nm -D | wc -l
Symbol list size   8370377  1990464  nm -D | wc -c
```

There is still room for future improvement regarding exported symbols.  I'd like to look at using gcc/clang `-fvisibility=hidden` with explicit exports at some point.

--------

Testing:
- the unit tests should pass, and all jobs should remain green
The `compat/endian` directory is a verbatim import of the headers in https://github.com/boostorg/endian with no changes except to the include guards.  I'd prefer not to change this to make it easy to keep in sync with the upstream, until it's part of an official Boost release.