General cleanup

- Fix race condition on starting worker thread.
- Only start worker thread if API key appears valid.
- Use BlockingCollection directly instead of creating an event per message in synchronous mode.
- Create less garbage by eliminating unnecessary Tuple per message in both sync/async modes.
- Less string formatting and reformatting to send the same message.
- Throw errors for incorrectly formatted metrics instead of logging.
- Switch to NLog directly
- Switch to .NET 4.5