Add `abstract_singleton` and `singleton_mgr`
All singletons now must implement `abstract_singleton`. The access to the
singletons is only possible through `singleton_mgr::get_instance()`.