[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.
Ditto. `BlockPartitionInfo` -> `SubmatrixInfo`?

Can `startRow` be determined from block row index plus the partitioner? Are we going to support irregular grids?