Introduced `getNumberDegreesOfFreedom` into conformer class

This partially addressed issue #213.

This function gives the total molecular degrees of freedom for a
species. I think it belongs in the conformer class, but please let me
know if you think otherwise. I've also included a couple unittests for
ethane and ethylene. I've recompiled RMG-Py and ensured that it's
working. That it's working is one thing, but apologies in advance for
the crappy programming style :)
added aromaticity recognition for symmetry calcs

Aromaticity is now perceived in calculating cyclic symmetry numbers.
This commit copies a molecule inside `calculateCyclicSymmetryNumber`,
turns it into an rdkit object, finds all the aromatic bonds and atoms.
The same bonds and atoms in the corresponding rmg molecule object are
then redifined so that the alogorithm is using the correct information.

There is one strange thing about this fix that I dont yet understand.
The unittest thinks cyclic symmetry number of dimethylbenzene is 1
(should be 2). On my local machine, the same
`calculateCyclicSymmetryNumber` function gets it correct, at 2. Also,
i'm inadvertantly printing a bit to stdout, and not sure why it's
happening?

relevant to issues #12, #24, #119, #70, #141
New (failing?) cyclic symmetry number unit tests.

Not sure if 1,2-DimethylBenzene should have same *cyclic* symmetry number as 
1,3-DimethylBenzene? Some more documentation (in the docstrings) about what exactly
this cyclic symmetry number is would help
fixup! added aromaticity recognition for symmetry calcs

Better to avoid casting to string if we can - just check if it is None.
fixup! added aromaticity recognition for symmetry calcs

I think this could have been nasty!
atomType is a mutable object. Suppose it was a Cds atom type. What your code would have done,
is change the label on all Cds atom types to be 'Cb'. 
   atom1 -> AtomTypeCds -> label -> 'Cds'
would become
   atom1 -> AtomTypeCds -> label -> 'Cb'
instead of 
   atom1 -> AtomTypeCb -> label -> 'Cb'

Because the AtomType objects are shared, I think it would have changed them everywhere,
not just in this copy of this molecule.
I think this may be a bug. Would you like to investigate?
fixup! Introduced `getNumberDegreesOfFreedom` into conformer class

Rather than look up self.conformer.modes[i] loads of times,  we look it up once
and store it in a local variable 'mode'. It is lookups that take time in Python,
so this would be faster (as well as hopefully easier to read and debug)
fixup! Introduced `getNumberDegreesOfFreedom` into conformer class

Better to explicitly check for what you are looking for, than assume that 
the exception you catch in a try/catch block is the right one. Makes code 
easier to read too.

My question is should we be checking for `Torsion` or is `HinderedRotor` the correct class?
fixup! Introduced `getNumberDegreesOfFreedom` into conformer class

Try/except could catch other exceptions, and suggests that the try ought to work.
Maybe this should actually be a type check on mode (is it an instance of `Vibration`, for example)?
fixup! Introduced `getNumberDegreesOfFreedom` into conformer class

The "else: pass" blocks are redundant.

You may consider chaining all the "if" blocks as "elif", and end with a final
"else:" that raises an "I don't know what this type of mode is!" type of error.
Merge pull request #1 from rwest/216

Suggestions for your pull request #216
Merge branch 'master' of github.com:enochd/RMG-Py into qchem