Clean up handling of rare books to be enum independent.

There's now an is_rare_book() and a set of book types defined in
spl-book.cc.
Clean up hardbook handling.

Since it's 100% identical to the set of randbooks, leverage one set of
data to map to both.
Dispersal improvements.

Affect a wider area (up to radius 4 at full spellpower, which might need
reduction); apply a confusion check at the same spellpower (being warped
around is very confusing - just check translocation miscasts).

Hopefully people will find more of a use for it with these adjustments.