Major rework of the driver interface codebase

The goal of this PR is to avoid building driver code which is explicitly disabled at configure time. This enables us to forgo the if-elseif wrappers and defining empty functions for each driver as the code will simply not be built when not in use. As part of this work I moved all driver files into driver-specific folders as to reduce the clutter.

The PR also gets rid of the legacy static driver interface definition and integrates it into vmi_instance.

The abstracted driver functions which perform safety checks to see if the given function is defined for the driver in use are converted into static inlines.

The driver initialization has been split into two: driver_init which is only responsible for base driver setup, and driver_init_vmi which is responsible for setting up file/domain specific values.