[WIP] 4D tensor -> ND tensor

This is a working-in-process PR that upgrade Mocha's 4D-tensor to general ND-tensor.

* The interface will be *almost* backward-compatible, meaning that old code using 4D tensor will still run as before.
   * Some breaks will still be introduced. For example, old `ReshapeLayer` explicitly specify the new `width`, `height`, and `channels`, but now we need to specify a general target dimension
* Some layers will require the ND-tensor to be 4D explicitly (for now) because some of the implementations rely on the 4D-tensor shape
   * It is expected those requirements will be relaxed gradually when the implementations get generalized / re-written