Scans API for ophyd

Hi,

Here is the first cut again for scans using the class concept. This is tested with the xf23id1 config. 

Generic N x M scans are possible. 

Needs work on type checking and exception handling. 

Comments?
S
I think something like

```python
edges = [np.linspace(strt, stp, pts) in zip(start, stop, npts)]
paths = [np.array(_) for _ in zip(*product(*edges))]
```
simplifies this code.

 `paths` is a list of arrays which are the paths for each positioner to follow.

```python
import numpy as np
from itertools import product

start = (0, 0, 0)
stop = (1, 1, 1)
npts = (2, 2, 2)

edges = [np.linspace(strt, stp, pts) for strt, stp, pts in zip(start, stop, npts)]
paths = zip(*product(*edges))
print paths[0]
print paths[1]
print paths[2]
```

```
In [31]: (0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0)
(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0)
(0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0)
````