Use RDKit instead of Openbabel in toSMILES() for N2 species

fixes #175
Speed up the SMILES generation by looking up small molecules, and test it.

The previous algorithm checked the molecular formula anyway, so we may as well
use that to shortcut a bunch of things that can be uniquely identified that way,
to avoid calling OpenBabel or RDKit.

I also made a unit test that we get back the same SMILES we started with.

Inspired by and closes #175
Quick and dirty fix for #177 for Mopac parsing.

MOPAC has changed its output slightly.
This is a quick fix, but still not terribly robust.
Part of me feels we shouldn't be keeping a separate fork of cclib.
Fix PDep Pruning bug introduced in e712697

Commit e712697f18c01e0d6ab419c37bc5248e1e3d3e8b changed the way we store PDep networks
so they are in a dictionary (keyed by entrance source) instead of a long list. This
greatly sped things up. However, it meant you have to iterate over two loops instead of one.
In modifying the code, some parts were not indented so were not included in the inner loop.
Hopefully this is not the only reason things sped up!! (although it must have helped!)

I noticed this while looking at the code around issue #176, which was just an off-by-one 
problem indexing an array from 1 instead of 0. The off-by-one thing doesn't actually hurt things
much because we don't use the array for anything anyway! (I'll remove it in the next commit)
Store PDep networks in List *and* Dictionary.

This means we can use the list when we want them to be in the same order,
and use the dictionary when we want to look them up (quickly) by source.

Perhaps an "ordered dictionary" class would be better, rather than us having 
to maintain two things (it'd be easy to not delete from or add to one of these 
stores at some point, especially when pruning)….

This addresses #176
Add message to UndeterminableKineticsError instead of printing warning msgs.

The warning msgs are misleading because on the first pass we try to find
a reaction template for the training reactions in the forward direction
as written.  However, these UndeterminableKineticsErrors are ignored
and the reactions stored in the reverse direction in case the user had
written them in the reverse direction.  By printing warnings at this
step we mislead the user into believing there is something wrong with
finding a template, when this is not actually the case.  The job will
fail if a reverse template cannot be found.