Rename walls to walls-without-doors
Add docstring for fully-walled-grid test
Call generate-maze instead of recur

We cannot use recur in solve-maze because the canvas does not get
updated between iterations. For consistency, it makes sense to not use
recur here either.
Extract solved-location? from core/solve-maze
Return hash-map of walls from generate-maze
Return hash-map of path from solve-maze
Use merge for recursive calls to solve-maze
Use merge for recursive calls to generate-maze
Rename visitable to unvisited

This is more clear because we are randomly picking from
unvisited-neighbors
Extract random-reachable-neighbor from solve-maze
Move common visited conj to let in solve-maze
Move common visited conj to let in generate-maze
Remove unnecessary :or for update-channel

This will be nil already if not provided
Give generate-maze and solve-maze the same options

This will help merge common behavior into a shared function.
Send maze to update-channel in solve-maze
Adjust whitespace; make channel update one-liner
Use key arguments for random-unvisited-neighbor
Use key arguments for random-reachable-neighbor
Pass location, maze to random-reachable-neighbor
Pass location, maze to random-unvisited-neighbor