Hold logger by base type instead of derived, to avoid needless upcasts

Specific type logger_service_t needed only to call initialize() method at service_manager's construction time. All further uses mean and require base type logger_t only. So it's more accurate to hold logger by base type and downcast it to logger_service_t once.

Also this change fixed error resulting in get_system_logger() returning shared_ptr<logger_t> that holds invalid (zero) raw pointer in my builds (precise, g++ 4.6).