Use same depth-first search for generate and solve

Fixes #2
SJO :airplane: PDX

`generate-maze` and `solve-maze` use an identical depth-first search. This pulls the algorithm into `search-maze` and lets each specify a different finish condition.

- We are done generating the maze when all locations are visited.
- We are done solving the maze when we've reached the solved location.

In order to see the bits that these two functions had in common, there's also some function renaming.

```clojure
(defn generate-maze [maze]
  (search-maze (merge maze {:finished-fn visited?})))

(defn solve-maze [maze]
  (search-maze (merge maze {:finished-fn solved?})))
```