The new module system is target-based rather than variable based. All
information is passed between targets using target properties and
leveraging CMake where possible such as for things like include
directories and linking libraries.
Where CMake doesn't handle things automatically, we store properties
ourselves. This includes whether a module needs autoinit logic (and a
function to handle adding the autoinit logic to a set of targets), which
headers to wrap in various languages, etc.