If the toTypedPipe on product is not a lazy val, I fear we are going to compute matL2Norm twice here. Once on the right, and once on the left.

Maybe not since matL2Norm is not lazy, but in general, should the toTypedPipe on all subclasses of Matrix2 be lazy val? I think so.