Implemented sparse matrix abstract data type

The sparse matrix abstract data type is to be used in linear algebra routines which don't alter the form of the input matrix (such as krylov subspace methods).