core: Re-implement IO::Open with an internal engine factory
Created by: bradking
Replace the hard-coded cascading-if table of engine construction with a factory using runtime lookup. This will be useful for runtime registration of optional engines.
Split registration of IO factory entries. Register serial engines statically. Add runtime registration of MPI engines that are guaranteed to be available if the application creates a MPI-backed ADIOS communicator.
The HDF5 engine is special in that it is serial or parallel based on how HDF5 itself was built. Register it only as one or the other. Teach the HDF5 engine factory function to create the engine only when using the matching kind of communicator.
The SST engine also supports working with or without MPI. Leave it registered statically for now. Later the two variants can be split.