Implement Matrix functions

This PR implements:
* Submatrix
* Transpose
* Fraction free gaussian elimination
* Diagonal solve
* Fraction free versions of Gauss elimination and Gauss Jordan elimination

#### TODO
- [x] Implement pivot list in pivoted versions of the elimination algorithms
So it seems to me that you are not handling the right hand side vector, and then you just substitute A -> B, because B is the output matrix. Given the nature of the algorithm, I think you can simply overwrite the matrix A. It is then the responsibility of the caller to do the copy, if needed. Sometimes you don't want the original matrix, so the copy is unnecessary. Anyway, but as far as the algorithm goes, doing the two changes, I get:
```c++
for (i = 0; i < col; i++) {
    if (i > 0) d = B.m_[(i-1)*col + i - 1];
    for (j = 0; j < row; j++) {
        if (i == j) continue;
        for (k = 0; k < col; k++) {
            B.m_[j*col+k] = sub(mul(B.m_[i*col + i], B.m_[j*col+k]), mul(B.m_[j*col + i], B.m_[i*col+k]));
            if (i > 0) B.m_[j*col+k] = div(B.m_[j*col+k], d);
        }
    }
}
```
Which looks like exactly what you have there.