[WIP] [TACHYON-152] 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();
  }
}
```
@dcapwell 
Thanks, I will push an new PR to fix the issues.
1. yes, it is better that BlockHandler maintains position state, since Tachyon doesn't support random write on block files. 
2. yes, I will replace the Path with Tachyon URI
3.it is a bit complicated, here is my opinion: Tachyon assumes that different blocks have different block Ids and block files, if trying writing to a block that exists(same URL), BlockHandler assumes that it tries to append to the block file. if BlockHandler does attempts to "append"(set by constructor parameter), BlockHandler will append data to the block file, otherwise throws an Exception saying that Tachyon doesn't support overwrite existing blocks.