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
This looks like the correct algorithm. Can you post the output of:
```
+    DenseMatrix A = DenseMatrix(2, 2, {integer(1), integer(2), integer(3), integer(4)});
+    DenseMatrix B = DenseMatrix(2, 2);
+    fraction_free_gauss_jordan_elimination(A, B);
+
+    assert(B == DenseMatrix(2, 2, {integer(-2), integer(0), integer(0), integer(-2)}));
```
Post the `B` matrix. Now we need to debug it. I should be trivial for 2x2 matrix. Put some debug print statements into the algorithm, print what it does, step by step. Etc.