huge refactoring: methods moved to classes, major logging improve

yes, `docker.Client` has special handling for `None`