Performance optimizations and memory management

Added some benchmarks to secure channel and played around with improving its performance, also started using a sync.Pool for message buffers.
I don't like this. `ReadMsg()` should continue to work like `io.Reader.ReadFrom`, i.e. passing our msg buffer in. 

I understand that means we have to keep a buffer while listening. I don't think one buffer is massive overhead (particularly knocking our sizes down to something reasonable, like 4KB).