Implement Matrix functions

This PR implements:
* Submatrix
* Transpose
* Diagonal solve
* Fraction free versions of Gauss elimination and Gauss Jordan elimination

#### TODO
- [x] Implement pivot list in pivoted versions of the elimination algorithms
Hm, that's weird. Here is what I would do. I would add the right hand side there, because without it, it's not very useful. (I.e. Do you have any application for this function? I can't think of any.) And then you can simply check the solution --- once you get the diagonal matrix, you simply divide  the calculated new right hand side by the corresponding diagonal element, and you get the solution. So you multiply by the original matrix A and you must get the original right hand side. If you do, you know the algorithm works, as long as the final diagonal matrix and right hand side are fraction free.