add in ability to use pools for allocation

`golint` 

```Go
	if s.BufPool == nil {
		return make([]byte, size)
	}
	bufi := s.BufPool.Get()
	buf, ok := bufi.([]byte)
	if !ok {
		panic("Got invalid type from sync pool!")
	}
	return buf
```