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
Current implementation of the algorithm gives `B = [4, 0, 0, 4]` as the output. I tried to workout the algorithm in the paper by hand and result is same as our implementation, not the determinant (-2) in the diagonal as the paper states.

Initially, `B = [1, 2, 3, 4]`. All the variables `i, j, k` can take only `1` and `2`.

* When `i = 1`:

  `d` is not set since `i = 1`

  Since `j != i` inner execution takes place only when `j` is `2`. Also `k` goes from `1` to `2`.

  * When `k = 1`

    Replacing `(i, j, k) by (1, 2, 1)`, `a_{jk} = a_{ii}a_{jk} - a_{ji}a_{ik}` becomes `a_{21} = a_{11}a_{21} - a_{21}a_{11}` = `1*3 - 3*1 = 0`. So now `B = [1, 2, 0, 4]` 

  * When `k = 2`

    Replacing `(i, j, k) by (1, 2, 2)`, `a_{jk} = a_{ii}a_{jk} - a_{ji}a_{ik}` becomes `a_{22} = a_{11}a_{22} - a_{21}a_{12}` = `1*4 - 0*2 = 4`. So `B` doesn't change. `B = [1, 2, 0, 4]`

* When `i = 2`

  Since `i > 1`, `d` is set to `a_{11}` which is `1` so we don't want to consider division by `d`.

  Since `j != i` inner execution takes place only when `j` is `1`. Also `k` goes from `1` to `2`.

  * When `k = 1`

    Replacing `(i, j, k) by (2, 1, 1)`, `a_{jk} = a_{ii}a_{jk} - a_{ji}a_{ik}` becomes `a_{11} = a_{22}a_{11} - a_{12}a_{21}` = `4*1 - 2*0 = 4`. So now `B = [4, 2, 0, 4]` 

  * When `k = 2`

    Replacing `(i, j, k) by (2, 1, 2)`, `a_{jk} = a_{ii}a_{jk} - a_{ji}a_{ik}` becomes `a_{12} = a_{22}a_{12} - a_{12}a_{22}` = `4*2 - 2*4 = 0`. So now `B = [4, 0, 0, 4]`