`WithField` and `WithFields` right now doesn't chain properly. Meaning
that if you do something like:
localLog := logger.WithField("tag", "value")
localLog.WithField("v1", "value").Info("message1")
localLog.Info("message2")
The `v1` will be carried over to `message2`.
With this patch, each WithField/WithFields call are isolated.
The Level() family of log methods defer formatting of log
values until it is confident that the log level needs them.
This change allows that deferral to happen at the Levelf()
and Levelln() levels too.
This commit also adds benchmarks to demonstrate the improved
performance of these functions