Use module-level loggers

Use module-level loggers so that implementers can configure the logging in more granular ways.

The logging module when used directly defaults to the `root` logger, which while easy to use, does not allow for much control for printing/silencing different modules logging output when on larger projects.

Using the standard of instantiating a logger using the _module name_ still keeps logging usage simple, while adding better control, and also helps to show where specific messages are being generated from.

Also the `log_level` parameter is removed from the app initialization, since this is automatically provided by the logging module (users can configure the root module or any named module anywhere before starting the app). A good place for that would be in a settings part of the client app.