Code cleanup using lookup tables

There were parts of the code that seemed to make more sense as a lookup table instead of a long list of if/else statements.  Changing it to this form seemed to cut down (just slightly) the execution time and memory usage.

Also added some comments and helper functions to make it easier to understand (and hopefully improve) the algorithm.

@tlycken I was actually planning on adding the initial tests as a pull request too, but I forgot that I put them in the master branch. Do you mind looking over that as well?  Sorry about that.
I moved `add_vertex` and `chase` out of the while loop. Would it make more sense to move them completely out of `trace_level`?  Since `trace_level` is called once per contour level, there might still be the chance the `add_vertex` and `chase` get recompiled for each level.  But moving them out completely will require lot more parameters to be passed in.