Implement setting diagonal of a matrix and unit test

Only for backends using PETSc i.e. not CUDA
Add matrix-vector multiplication for host backends
Add Mat * Dat unit test
Also allow multiplying Mat by PETSc Vec
Add Mat * Vec unit test