Client write refactor

Rewriting how client writes out blocks to make it easier to add remote blocks.

The current design is as follows:

Users requests access to a block

```java
Block block = Blocks.createBlock(tachyonFS, blockId, blockCapacityByte);
```

From there, the user can write to it by accessing its `Channel`.

```java
WritableBlockChannel channel = block.write();
channel.write(byteBuffer);
channel.close();
```

When the block is full, write returns -1, so you do this in a loop and create new blocks.

```java
while (buffer.remaining() > 0) {
  int n = mCurrentBlockChannel.write(buffer);
  if (n <= 0) {
    // block full, get new block
    getNextBlock();
  }
}
```

There is still one bug that I am tracking down (TachyonFSTest.unlockBlockTest2 and TachyonFSTest.lockBlockTest2 are failing), but I think the design is good enough to share.
According to my understanding, buffer.array() only supports for array-backed buffer. One secure way is to check hasarray() before using it. For example, the buffer is direct buffer, it will cause certain exception by using array(). If we'd plan to support directbuffer, we'd better get rid of array() function here.

Any thing misunderstanding, please point it out.