Element wise

Hi I have been a little busy all the while. I have just compleated the code for Element wise matrix functions. The PR I have submitted earlier was very confusing and was unable to rebase it, so I am writing a new one.


    >>> from sympy import MatrixSymbol, Lambda, Symbol, symbols, cos, ElemWise
    >>> A = MatrixSymbol('X', 3, 3)
    >>> B = MatrixSymbol('Y', 3, 4)
    >>> x = symbols('x')
    >>> z = Symbol('z', real=True)
    >>> f = Lambda(x, z*x)
    >>> g = Lambda(x, cos(z*x)**2)
    >>> L = ElemWise(ElemWise(A*B, f), f).evaluate()
    >>> O = ElemWise(ElemWise(A, g), f).evaluate()
    >>> T = ElemWise(ElemWise(A, f), g).evaluate()
    >>> L[1, 1]
    z**2*(X[1, 0]*Y[0, 1] + X[1, 1]*Y[1, 1] + X[1, 2]*Y[2, 1])
    >>> O
    ElemWise(X, z*cos(x*z)**2)
    >>> T
    ElemWise(X, cos(x*z**2)**2)

Fixes #6801.
What if `matrix` isn't a `MatExpr`? In its current state, this will build with any input types (you do no argument checking). If `matrix` was a `Symbol` this method would just return `None`.

I'd opt for a default `else` method that errors, and also addition of init validation. See how other `MatExpr` types do this (`MatAdd` for example).