refactor plugin architecture

starting out with singleton pattern and seeing where it goes. it essentially removes a lot of overhead of standard components of the interface. the alternative is to have them be explicitly instantiated by the user, but it seems like a lot of boilerplate.