I feel like the most primitive form of running this is through a list of lines -- and going from file -> lines (ie, breaking something complex into something simple) is more intuitive than going from lines -> file pointer (ie, taking something simple and wrapping it to look complex).

ie:

```python
fp = open('file', 'r')
DemoRunner(fp.readlines())
```

is more intuitive than

```python
from StringIO import StringIO
lines = ['#', '#', '#']
DemoRunner(StringIO('\n'.join(lines))
```

Because of that, I think it'd be better off accepting a list of lines rather than a fp... Thoughts?