Add `Libdl.LazyLibrary` (#50074)
This provides an in-base mechanism to handle chained library
dependencies. In essence, the `LazyLibrary` object can be used anywhere
a pointer to a library can be used (`dlopen`, `dlsym`, `ccall`, etc...)
but it delays loading the library (and its recursive dependencies) until
it is actually needed.
This is the foundational piece needed to upgrade JLLs to lazily-load
their libraries. In this new scheme, JLLs would generally lose all
executable code and consist of nothing more than `LazyLibrary`
definitions.