[WIP][SPARK-1486][MLlib] Multi Model Training with Gradient Descent

**Note: This is still a work in progress**

This is the first of the pull requests to support multi-model training in MLlib. It batches examples and trains multiple models with different regularization parameters and step sizes all at once using Matrix-Matrix multiplication. It uses Native BLAS when the data matrix is dense, and uses sparse matrices as much as possible for both better memory utilization and performance (I will post performance results in the comments).

This is a HUGE Pull Request, therefore I'm posting this now. It is not finished, docs need to be updated, code can be somewhat cleaned up for ease of understanding. I'm posting this now so that users can comment and make suggestions along the way.

Most of the PR consists of adding additional Local Matrix operations for the calculation of gradients and losses.
The matrix multiplication algorithms are different. If A is transposed, the multiplication is very easy. A is in CSC format, therefore when you multiply something with A', we get the column indices for free. Then it is your high school matrix multiplication, but just using non-zero elements. Notice here that we update the values of C only once, therefore you can scale it inside the loop.

When A is not transposed, then you multiply the columns of A with the corresponding rows of B and add it to C. Every multiplication of the column of A and the row of B has the size C. Then it turns out you update the values of C multiple times inside the loop. Therefore if you wanted to have an initial scaling of C, you have to put it before the loop.