Add more array expressions.

Add `TensorDot` and `Transpose` expressions.  Also fix shape handling and enforce dshape validation on binary operators.

```Python
In [1]: from blaze import *

In [2]: x = symbol('x', '10 * 20 * int')

In [3]: y = symbol('y', '20 * 30 * int')
In [4]: x + y
ValueError: Shapes don't align, (10, 20)

In [5]: x.dot(y)
tensordot(x, y)

In [6]: y.T
transpose(y)
```
i think we should also restrict dot products to non option types as well. it's unclear to me what the best approach is to that

interesting and related blog post by statistician Radford Neal,

http://radfordneal.wordpress.com/2011/05/21/slowing-down-matrix-multiplication-in-r/