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
Yes, I'll try it. I excluded the right hand side because I thought of implementing solving separately. So this function was intended to let user see what the Gauss Jordan form of a given matrix is. But the ultimate goal of the method is to be used in solving a system(in `diagonal_solve`). But I guess it's better to do solving within this function itself because then we won't need to augment left and right matrices as currently being done by `diagonal_solve`