Modify Molecule.AddAtom in preparation for adding branch bonds

When an atom is added, don't assume it's bonded to the previously added atom.
The 'bondTo' parameter is an 'int option'. If it's None then behave as before,
(bond the new atom to the previous atom). Otherwise, bond the new atom using
the provided index.

The State record now keeps a BondTo field. It gets reset to None everytime an
atom is added (even though it's currently never set to anything other than None).

I'm about to add a stack to the State to keep track of branching. My idea is...

Whenever a branch gets opened, push the current position (atom index) on to the
stack. When a branch gets closed, pop from the stack into the BondTo field. This
way the next atom will get bonded to the earlier atom before the branch. Then,
resetting BondTo to none means it will continue as normal until another branch.
Introduce a parser to represent the 'restOfTheMolecule'...

...i.e., everything apart from the first atom.

This new parser is where I'm going to put parsing of branches (which may get a little
hairy because of the recursiveness) so I'm keeping it out of the main molecule parser
for clarity.
A first step at supporting branching

An atomChain is one or more atoms (actually 'subsequentAtoms' so they can be
preceded by a bond symbol and succeeded by ring closures).

A branch is simply an atomChain between brackets. Whenever a branch gets opened,
push the current position (atom index) on to the stack. When a branch gets closed,
pop from the stack into the BondTo field. This way the next atom will get bonded
to the earlier atom before the branch. Then, resetting BondTo to none means it
will continue as normal until another branch.

The restOfTheMolecule (i.e., after the first atom) becomes any combination
of atomChains and branches.

The many1 in the definition of the atomChain parser is interesting...
Apart from the fact a branch containing no atoms is not a legal smiles string, it
also means the 'restOfTheMolecule' parser could cause can an infinite loop. atomChain
could succeed without consuming input and without changing the parser state so
the 'many' in restOfTheMolecule could enter an infinite loop. (Actually, rather
than entering the infinite loop, this situation is detected and a
System.InvalidOperationException is thrown.)

What it can't handle yet:

+ Nested branches. A branch can contain other branches. (See
http://www.quanttec.com/fparsec/users-guide/parsing-with-user-state.html
for info on how to implement recursive parsers in fparsec)
+ Adjacent branches, e.g., "C(C)(C)C" isn't parsed correctly