Refactor module and test suite

I ran into some issues with the test suite when I was trying to work on new features. So I decided to do a refactor first

- Refactor `write` method into three different methods with a single responsibility.
- Allow StatsD instrumentation to be removed.
- Split tests into basic statsd client tests, and instrumentation tests.
- No more leaky tests, by removing instrumentation and proper stubbing
- Added a live test that actually tests sending a UDP packet locally.
- Increased test coverage here and there.

Should be 100% backwards compatible (TM).

@jstorimer @csfrancis