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)
```
this should be `int64`

```python
In [15]: s = symbol('fx', '100 * 10 * bool')

In [16]: s.T.dot(s).dshape
Out[16]: dshape("10 * 10 * bool")
```