Remove pipeline_demo.py link

* util/pipeline_demo.py: Subject.
Propagate exceptions throughout the pipecomponents

When a component throws an exception we complete the pipeline by passing the
exception object instead of the normal return val. By default each component
will re-raise the exception. Components can intervene in the default behavior by
overriding the __chkExcept__ method.
* scripts/run-pipeline.py: We use the TimeStreamTraverser instead of TimeStream.
This allows for more control of the iteration. We now have access to the
timestamp that generates the next img instance.
* timestream/__init__.py (TimeStreamTraverser.__init__): New input argument
live_except. If true we check validity of img every time we try to
generate/access it.
(TimeStreamTraverser.curr): Now calls getImgByTimeStamp to execute command
(TimeStreamTraverser.getImgByTimeStamp): Checks for errors when live_except is
True. Note that when live_except is false we check for errors in __init__.
* timestream/manipulate/__init__.py: Moved all exception classes here.
(PCExBadConfig): New exception to be thrown when a configuration element is not
right.
(PCExBadContext): Thrown when a context element is not right.
* timestream/manipulate/pipecomponents.py (PipeComponent): Before we call
__exec__, we check to see if there is an exception and re-raise it.
(PipeComponent.__chkExcept__): New method that is called to check for existance
of exception in input args. This is the method that should be overloaded in case
a component needs to do something with the exception.
* timestream/manipulate/pipeline.py (process): We re-raise the exception that
was returned after running the whole pipeline.
Remove the "output to ndarray"

We are not using it and its becoming a pain to maintain in ResultFeatureWriter.
When we want to implement an alternative way of outputing features, we can
re-add it.
* timestream/manipulate/pipecomponents.py: Remove all ndarra output feature
logic.
Update image recalculation policy

We control the recalculation from a --recalculate cli option.
We differentiate between ignoring images becase they are already calculated and
just ignoring.

* scripts/run-pipeline.py (existing_ts): is now the only var that holds the list
of the calculated (existing) images.
* timestream/__init__.py (__init__, getImgByTimeStamp): Use the new exception
when we find an existing image.
* timestream/manipulate/__init__.py (PCExExistingImage): New Excpetion.
Add logic to recover previous CSV feature files.

* timestream/manipulate/pipecomponents.py (Resultingfeaturewriter.overwrite):
The default is not False.
(Resultingfeaturewriter._featFiles): New instance attribute that will hold the
csv paths for every feature name. It is a dictionary.
(Resultingfeaturewriter._prevCsvIndex): When we want to recover previous feature
values from old csv files we initiate a prevCsvIndex. It holds the timestamps
for every feature and the byte offset where they are located. _prevCsvIndex
allows us to index a large amount of feature data.
argNames, errStr)
(Resultingfeaturewriter._addErrStr): New Method that appends class.errStr to the
output file.
(Resultingfeaturewriter._recoverFromPrev): New method that recovers a specific
timestamp row from a previous feature csv file.
(Resultingfeaturewriter._initPrevCsvIndex): New method that initializes the
index dictionary used to keep the file offsets of previous features.
Implement __chkExcept__ at ResultingFeatureWriter

* timestream/__init__.py (getImgByTimeStamp): Remove debugging line.
* timestream/manipulate/pipecomponents.py(Resultingfeaturewriter._guessTimeStamp):
New method to guess a timestamp with a TimeStreamImage
(Resultingfeaturewriter.tsHName): Hard coded name for the column holding the
timestamps.
(ResultingFeatureWriter.__chkExcept__): New method to append data to feature
files when there is an exception in the pipeline.
Add audit file to CSV outputs.

* timestream/manipulate/pipecomponents.py
(Resultingfeaturewriter._appendToAudit): New method with logic to output to
audit file.