Abstracted the implementation of components

Allows for multiple different implementations of the core components of
the propnet, with instantiation provided by a runtime switchable factory