Provides support for MDC which is inheritable across (virtual) threads. Only MDC values set using the where method will be inherited; this method also defines the scope, within which the provided MDC values are available.
The semantics of MDC.put are unchanged: values set using this method will only be visible in the original thread. That is because the "usual" MDC usage is unstructured, and we don't want to set values for the entire scope (which might exceed the calling thread).
Internally, a ForkLocal (backed by a ScopedValue) is used, to store the scoped context.
Prior to using inheritable MDCs, the init method has to be called. This performs some operations using the reflection API, to substitute Logback's MDC support with one that is scope-aware.