Report device enumeration errors with exceptions to be consistent with other initialization related function calls. Reduces the amount of code to maintain.
Simplify Vulkan's backend initialization code by moving it to a separate file, allowing us to initialize a Vulkan instance from different backends.