opt: transpose(inv) -> inv(transpose)

This transformation canonicalizes sandbox linalg ops so that the various
cholesky-related transformations are not confused by a transpose.
opt: solve(chol) -> solve(triangular, chol)

Cholesky outputs a triangular matrix, so if a general solve is applied to
a cholesky output, then transform it into a triangular solve.
enh: infer_shapes for MatrixInverse
fix: local_log_add dont crash on >2 args
enh: tag_solve_triangular transpose case
enh: faster CGer
check if the node has an owner before accessing owner op
Initial version of optimization
Removed debug prints
- remove a variable that's not used anymore
- remove unnecessary comments
adding infer_shape test for MatrixInverse Op
testing Solve perform method with specific cases for lower and upper traingular matrices
Fix failing tests
Removed useless copies in unittest
Remove unused code
Support case where vector input is already an output of scan
added unit tests for transinv_to_invtrans and tag_solve_triangular
Add tests and modify the optimization to cover new cases
Bug fix
registering local optimization for Solve op