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)
```
For various reasons I don't like putting logic into the type constructors.  Most of the logic *is* checked however when running `dshape`.  Calling assert would work if the comment isn't sufficient to demonstrate intent.