* update all READMEs with notices about the name change
* update changelog for 0.24
* bump crate versions to 0.24
* update version notice information
* update readmes to back reference trust-dns
* rename all crates to hickory counterparts
* replace all Trust-DNS references in code and comments with Hickory DNS
* rename all Trust-DNS references to Hickory DNS in non-code
* rename all trust-dns-resolver references to hickory-resolver
* rename all trust-dns-client references to hickory-client
* rename all trust-dns-proto references to hickory-proto
* rename all trust-dns-server references to hickory-server
* rename all trust-dns-compatibility references to hickory-compatability
* rename all trust-dns-integration references to hickory-integration
* rename all trust-dns-util references to hickory-util
* Update MIT licenses to reference Hickory DNS
* update all trust-dns references to hickory-dns
* update all bluejekyll github references to hickorydns org
* Update name in Changelog
* make sure hickory-dns logs during tests
* add changelogs for recent main additions
* fix references to trust-dns and hickory in architecture
* update a few trust-dns references in READMEs
* fixup some dangling trust_dns references
* replace fka with formerly in change log
* replace all hickoydns org references to hickory-dns
* replace all http links with https
* update logos
* update hickorydns to hickory-dns for all other org references
* fix Notices of Trust-DNS to Hickory in each Readme
Previously, the `reap_tasks` function could cause a tokio task to spinloop, preventing it from being cancelled.
This is because `FutureExt::now_or_never` returns an Option<T> where T is the inner future's resolution type.
If `join_set.join_next()` returned None, indicating there are no longer tasks to join, the `FutureExt::now_or_never` would return `Some(None)`.
However, the `is_some()` spinloop in this function would see the `Some(None)` and busy loop calling `FutureExt::now_or_never`.
This causes the tokio task to fail to be cancelled properly as it never yields to the executor.
The fix here is to use `Option::flatten` to transform the nested Option.
Now, the call to `reap_tasks` will only loop when the inner `join_set.join_next` returns `Some(..)`, indicating that a task is already complete.
When there are no tasks complete, or when the `JoinSet` is empty and returns `None`, the `reap_tasks` function will immediately yield.