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: 
These lambdas are getting a bit unwieldy - would they be easier to read if they were plain old static methods?