Optimization of SnappyOutputStream

Fixes for #82
* Reduced the number of memory copies when writing more than 1,024 bytes of data 
* Enabled buffering before dumping to the given OutputStream. So with this change, no longer need to wrap the output buffer as `SnappyOutputStream(new BufferedOutputStream(out))`. You can simply use `new SnappyOutputStream(out)`