Fix/117

Adding a S3OutputStream that upload blobs to the S3 Storage service with two modes (single/multipart).
When the length of the chunk is lower than buffer_size, the chunk is uploaded with a single request.
Otherwise multiple requests are made, each of buffer_size (except the last one which can be lower than buffer_size). 

For example, when uploading a blob (say, 1Gb) with chunk_size set for accepting large chunks (chunk_size = 5Gb) and buffer_size set to 100Mb, the blob will be sent into 10 multiple parts, each of ~100Mb. Each part upload may failed independently and will be retried 3 times.

Closes #117
I would like to split this class into an abstract base class that does all the buffering etc. that we can test separately. I think this class then should only implement one method maybe `protected abstract void flush(byte[] bytes, int offset, int length); ` that implements the uploading etc. 

I really wanna see some tests that write byte arrays larger than the buffer size etc. and randomize a lot of stuff here to make sure buffering works just fine?!