ioPath async - change `buffer.read` to `buffer.getbuffer`
ioPath async - change `buffer.read` to `buffer.getbuffer`

Summary:
**Before:** `NonBlockingIO` had a single `buffer`. On `flush`, we called:
```
item = buffer.read()
notify_manager(lambda: file.write(item))
buffer = io.BytesIO()
```
**Problem:** `buffer.read` returns a copy of the buffer, which takes a lot of time.

**Now:** `NonBlockingIO` maintains a list of `buffers`. On `flush`, we call:
```
item = buffers[-1].getbuffer()
notify_manager(lambda: file.write(item))
buffers.append(io.BytesIO())
```

This ensures we keep all of the original buffer data around until the writes are completed and don't make copies of the data.

----------

**Before:** `flush` took ~0.7s to complete for a 1GB buffer
**Now:** `flush` takes ~0.0001s to complete for a 1GB buffer

Reviewed By: sujitoc

Differential Revision: D26701826

fbshipit-source-id: 14a9db3f8db35e71ecb07bb82800512958b9b10a

facebookresearch/iopath,facebookresearch/iopath