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: 
@lodejard I was thinking about the same thing but I didn't wanna jam those into this PR. I was planning to send another PR after this one. What do you think?