A faster DFS implementation: (i) linear (ii) releases gil. Some assumpti...

I've re-implemented `depth_first_order`. 

The new implementation offers the following advantages:
1. linear in the the size of the input graph 
2. releases gil (does not use the interpreter at all)

As a result the new implementation is much faster.

In addition, this new implementation offers a deviation from the original functionality by representing the root of the tree using a self loop (which, to the best of my knowledge, is more standard). The original implementation uses "-9999" which introduces indices outside the domain of the nodes. Currently this behavior is only available through a deisgnated keyword.  
This doesn't actually work the way you think it does (as I've found out the hard way). This `raise` will abort the function, but because it's marked `nogil`, it has no way of propagating the exception. Instead it will log the exception to `stderr` and return.

In these situations, I usually return an error code, then check for that in a function that is not `nogil`.