[SPARK-3974][MLlib] Distributed Block Matrix Abstractions

This pull request includes the abstractions for the distributed BlockMatrix representation. 
`BlockMatrix` will allow users to store very large matrices in small blocks of local matrices. Specific partitioners, such as `RowBasedPartitioner` and `ColumnBasedPartitioner`, are implemented in order to optimize addition and multiplication operations that will be added in a following PR.

This work is based on the ml-matrix repo developed at the AMPLab at UC Berkeley, CA.
https://github.com/amplab/ml-matrix

Additional thanks to @rezazadeh, @shivaram, and @mengxr for guidance on the design.
The name `BlockPartition` is a little confusing. Is it a partition? Do we allow multiple blocks per partition? If this is just talking about a block, we can call it `Submatrix` (see: http://en.wikipedia.org/wiki/Block_matrix).

Should the name be `blockRowIndex` instead of `blockIdRow`? `Id` is not the same as `Index`.