split NullLogger into its own file, cleaned up Callback, and added new get_last_exit_code method