Pipelining

Pipelines are created by transforming a list-of-dicts specification into celery
tasks, which are then chained. Optionally, store_single tasks are placed at the
end of the chain or after each task.

Before creating the chain it checks how much of the result is already stored,
and starts processing from the stored result 'furthest' in the pipeline.

Issues:
- since store_single only accepts a string as 'taskname', it is now a concatenation
  of the celery task names of the chained tasks. This is (a) not very nice and 
  (b) is a technical detail that belongs in es, not in pipeline
- parameters (such as nltk 'model') are disregarded at the moment
- I dislike the 'blocking' parameter, I feel that the pipeline function should
  always return an AsyncResult. However, if the whole result is in cache, there
  is no celery task to run (so no AsyncResult) to return. So, with blocking=False
  the return type depends on the state (nasty). The only solution I see is to
  'mock' an asyncresult, but that is not much nicer.
  (on second thought, if pipeline is used as a task, it doesn't matter so much,
  as pipeline.delay().collect() will always return the actual result)