moved string.Format job into the formatter for WriteWarning extension method

I believe that `string.Format` shouldn't be called directly as `WriteWarning` method receives the message and args parameters. The warning logging could be disabled and `WriteWarning` would end up calling `string.Format` for no good.

I'm also not sure about my implementation here :smile: I used `Tuple` and it felt dirty :smile: 
Using a method as a delegate parameter will cause a new Delegate instance to be allocated per call... How about adding static fields that are initialized to point at these methods, then use the static fields when .Write is called?