Added _eval_derivative_wrt interface

This patch adds the _eval_derivative_wrt interface that has to be
implemented by non-symbols with _diff_wrt = True.

The _eval_derivative_wrt method returns a new (dummy) symbol and
a new expression in which all instances of self have been replaced
by the dummy symbol, or None if no such representation can be
created. The main diff() function then differentiates the new
expression with respect to the dummy symbol.
Improved/fixed MatrixElement._eval_derivative_wrt

Detect cases where we can not be sure if a MatrixElement in expr is
or is not equal to self and by returning None make sure we do not
attemt to actually perform the differentiation in this cases.