Add an initialize method to logger definition that allows us to map and validate default config before passing to logger_fn.
expanded unit tests.
i guess initialize is better than logger_fn but 
 why cant i just invoke the function str_logger that i wrote?
I think the argument against is that str_logger does not behave like a function in other contexts and is not named like a function. A solid feels like a function. You'd probably give it a name that's a verb, not a noun, e.g. compute_x. There are places where you treat it like a function like by invoking it during composition. On the other hand, someone seeing ModeDefinition(logger_defs=[my_logger]) would not expect that my_logger is a function.
I see the case, but i feel like if you are testing it directly like this theres a good chance you wrote it, and if you wrote it you know its a decorated function and may be looking to just invoke it.
In fact you can invoke it * it just behaves in an unintuitive way
should we change the __call__ impl to go down this path in addition to having a method like initialize ?
The fact that this logger defs do literally need to be callable is a point in favor of just making them callable, in my book. Why have both methods if call is gonna redirect to initialize? Calling will always be more convenient