Use bytes.Buffer rather than creating dozens of garbage strings

@Shopify/stack @mkobetic @snormore

I can't think of any way to further reduce allocations short of implementing a `WriteFloat` counterpart to `strconv.AppendFloat`.

```
% go test -test.bench . -test.benchmem
PASS
BenchmarkNewSet   500000              3394 ns/op             201 B/op          4 allocs/op
BenchmarkOldSet   500000              5205 ns/op             297 B/op         14 allocs/op
BenchmarkNewGauge         500000              3734 ns/op             241 B/op          6 allocs/op
BenchmarkOldGauge         500000              5561 ns/op             307 B/op         13 allocs/op
```