Depth First & Breadth First Traversal, and Travis CI integration

*see dfs branch for commit history for depth first traversal.
Eep. Never pass in a mutable object as a default parameter (```traversed=[]```). When you do this, Python only evaluates ```traversed=[]``` the first time through. If you run depth_first_traversal() again without a traversed argument, ```traversed``` will remain bound to wherever it ended up and you suddenly have a bunch of stuff when you meant to have an empty list. It took me a long time to figure out why your test_depth_first_traversal_multiple_runs() was succeeding in spite of this. I finally noticed this!

When you do list concatenation like this, you actually create a new list, rather than modifying the old one. This is a problem in terms of space complexity. append() modifies the old list, and that's why you were getting the result that your list was doubling itself each time depth_first_traversal() was run.

The normal way to handle wanting an empty list as a default parameter is like this:
```
def depth_first_traversale(self, node, traversed=None):
    if traversed is None:
        traversed = []
    ...
```

I hear this is a not-uncommon Python interview question (i.e. "what's wrong with this code") so even though it doesn't come up that often, it is something to remember.