Add test for custom predators. Go dragons!
Add non-optimal solver

This is not a _smart_ solver, just brute force. It may not even been
correct as I probably haven't exhaustively checked it. Might be a good
time to learn QuickCheck.

There's one tricky bit to this solver: if the farmer is on the left then
he doesn't want to go over empty handed unless that's the only remaining
move (and maybe not even then?) but if the farmer is on the left then he
wants to come across empty handed so that he has an empty boat to bring
more stuff over.

There were a few solutions that I thought wouldn't work but ended up
working for one reason or another: e.g. duplicates are removed when
moving an item from one bank to the other because the "remove items"
function removes every matching item, duplicates included; also, I
thought if the dog ate both the chicken and the grain the farmer would
be stumped, but he found a way. Smart farmer. (Solution: the chicken
no longer at grain so the grain and the chicken could be left together
... fd>, <f, fc>, <fd, fg>, <f, fd>.