New lwIP-based Ethernet library for Teensy 4.1

I just released v0.28.0. Here's the Changelog:
Markdown (GitHub flavored):
## [0.28.0]

### Added
* Added raw frame loopback support and a `QNETHERNET_ENABLE_RAW_FRAME_LOOPBACK`
  macro to enable.
* Added a fourth step to the _MbedTLSDemo_ example instructions: modify
  the config.
* New `EthernetFrameClass` functions: `destinationMAC()`, `sourceMAC()`,
  `etherTypeOrLength()`, and `payload()`.
* Consolidated all the hardware abstraction layer (HAL) functions into one
  place: `qnethernet_hal.cpp`.
* New `NullPrint` and `PrintDecorator` utility classes in the
  `qindesign::network::util` namespace.
* Added `driver_is_link_state_detectable()` function to the driver. This is for
  detecting whether the hardware is able to read the link state.
* Added `EthernetClass::isLinkStateDetectable()` to detect whether the driver is
  capable of detecting link state.
* Added `setOutgoingDiffServ(ds)` and `outgoingDiffServ()` functions for
  modifying and accessing the differentiated services (DiffServ) field,
  respectively, in the outgoing IP header, to `EthernetClient`
  and `EthernetUDP`.
* Added `EthernetUDP::receivedDiffServ()` for retrieving the DiffServ value of
  the last received packet.
* Added `EthernetFrameClass::clear()` for clearing the outgoing and
  incoming buffers.

### Changed
* Updated the Mbed TLS version in the README and comments to 2.28.8
  (was 2.28.6).
* Updated `mbedtls_hardware_poll()` in _MbedTLSDemo_ example for
  other platforms.
* Improved the _PixelPusherServer_ example.
* The address-changed callback is now called for independent IP address,
  netmask, and gateway changes.
* Improved link function documentation for `linkStatus()`, `linkState()`,
  and `isLinkStateDetectable()`.
* Updated `EthernetClient::setNoDelay(flag)` to return whether successful.
* Add another 2 to `MEMP_NUM_SYS_TIMEOUT` option for mDNS, for a total of an
  additional 8. Timeout exhaustion was still observed with 6. Why 8 and not 7:
* Updated `EthernetClient::connect()` to return a Boolean value. (The function
  signatures don't change; they still return an `int`.) This matches the new
  definition at
  [Ethernet - client.connect()](
* Changed `EthernetClient::connectNoWait()` return types to `bool`.

### Fixed
* Improved marking of unused parameters.
* Fixed up use of `__has_include()`, per:
  [__has_include (The C Preprocessor)](
* In mDNS, ensure there's at least an empty TXT record, otherwise the SRV record
  doesn't appear.
* Make the alternative `yield()` implementation `extern "C"`.
* Fixed `EthernetUDP` data copy for zero-length outgoing packets. `pbuf_take()`
  considers NULL data an error, so only copy the data if the packet's size is
  not zero.

* DiffServ field support
* Address-changed callback now called for every change
* EthernetClient::connect() now returns a Boolean value (but still returns an int type), to match the new Arduino doc change
* Fixed mDNS responses