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.
This `sync.Pool` allocation should happen only on `NewChan`, otherwise, i can pass use `NewChanWithPool(n, something)` and if `something` is nil, it would not fail, and would be really, really hard to track down.