[math] (Re-)implement cross product in 2d/3d
This makes the old cross-product more efficient. The old version initialized a FieldVector with zeros and then filled it. The new version builds it's directly using consise bracket notation. The result can be moved without creating a copy. Implement a cross product in 2d that returns a scalar. Not mathematically clean but still useful. 2d and 3d cross products now explicitly only work in 2d and 3d. Other dimensions will trigger a compiler error.