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 would be more specific if I had more specific expectations.  Should either be some sort of ShapeError or the current ValueError.  Not sure yet which I want to choose.  So at the moment this test reflects my expectations.