Update configuration.py

* timestream/manipulate/configuration.py (PCFGExLockedSection): New exception.
We raise it when we try to change the configuration and its locked.
(PCFGSection.{_name,_locked}): New variables. They have to be accessed through
(PCFGsection.{lock,unlock,locked}): New methods that to control the locked
status.
(PCFGSection.listTree): New name for listIndexes.
(PCFGSection.iterTree): New name for iter_by_index.
(PCFGSection.iterSections): New method that will return all subsections from
this level.
(PCFGSection.addSubSec): Removed method. __setattr__ does the same thing.
(PCFGListSection): New class to handle subsections as lists. Subclassing is the
better way to do what we already were doing with iter_as_list. This subclass
will handle indexes that are supposed to be preceded by "_".
(PCFGConfig): Use new methods from parent and related classes.
* scripts/run-pipeline.py (genConfig): Iterate as itersections.
* timestream/manipulate/pipeline.py (__init__): addSubSec -> setVal
Add predefined config to configuration.py

This will allow to express our expectations on the configuration passed by the
user. It will also make the documentation easier.
* scripts/run-pipeline.py (genConfig): Most of what was here is not in
configuration.py.
(options): Small change where the user can now choose between -i, -p or both.
In the case where we receive input both in -i and in -p, -i trumps -p.
* timestream/__init__.py (add_log_handler): Correctly use LOGV.VVV
* timestream/manipulate/configuration.py (PCFGException.__init__): New method to
add message for general error.
(PCFGSection.getVal): Add a new argument pop. When True we remove the index from
the section.
(PCFGSection.setVal): We now allow setting of a PCFGSection.
(PCFGConfig.argNames): Class variable. Its a Json parseable string that
represents all the configuration options that are accepted. Note that the
individual component configuration are not here and should not be here. We can
define argument name, default value, type, whether it is required, documentation
and examples.
(PCFGConfig.__init__): We now force the configuration to have only three zero
level sections: pipeline, general and outstreams.
(PCFGConfig.append): This new method replaces merge. We can now append new yaml
files and decide if we want to overwrite or just add. It enforces the three zero
level sections and adds everything that is left to the general section.
(PCFGConfig.autocomplete): New method that tries to guess configuration values
based on what is already in place. It also casts values into relevant objects.
(PCFGConfig.loadFromFile): New method. Contains the old loadFromYaml as an inner
method.
(PCFGConfig.merge): Removed method.
Activate documentation for the cli

* scripts/run-pipeline.py (maindoc): New method that executes the documentation
printing.
(main): Add new maindoc method call.
* timestream/manipulate/configuration.py (PCFGConfig.info): New classmethod that
prints our all the relative information about the expected configuration.
(loadFromFile): We use cls to signify class.
(PCFGConfig): Change argNames into a python structure instead of a json string.
Add documentation for pipeline and config files.

* doc/config.rst: Add output of run-pipeline --doc --comp --conf. We should
switch to automatically generating this part of the documenation.
Update the authors on the documentation config.

* doc/conf.py: A more general name for author is "TimeStreamLib Team"
Update one line description.
If ts has less than 10 images don't add it.

* util/derandui.py (DerandomizeGUI._addTS): Raise RuntimeError if ts has less
than 10 images.
Derandomizer. Error if CSV headers are not unique

* util/derandui.py (DerandomizeGUI._addCsv): We cancel the CSV upload if we find
repeated headers.