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
Ok, so I think this algorithm as you wrote it is totally different to Algorithm 2 on page 13. Here is my understanding of the algorithm:
```c++
for (i = 0; i < col; i++) {
    if (i > 0) d = A.m_[(i-1)*col + i - 1];
    for (j = 0; j < row; j++) {
        if (i == j) continue;
        B.m_[j] = sub(mul(A.m_[i*col + i], B.m_[j]), mul(A.m_[j*col + i], B.m_[i]));
        if (i > 0) B.m_[j] = B.m_[j] / d;
        for (k = 0; k < col; k++) {
            A.m_[j*col+k] = sub(mul(A.m_[i*col + i], A.m_[j*col+k]), mul(A.m_[j*col + i], A.m_[i*col+k]));
            if (i > 0) A.m_[j*col+k] = A.m_[j*col+k] / d;
        }
    }
}
```
Let me know if this fixes the problem.