Implement clause indexing

Clause indexing is implemented in terms of unification hashing.
Before considering a clause as a candidate, its unification hash
must indicate that the two terms might unify.

This appears to work exactly as intended and reduces the number
of choicepoints generated during typical queries.  It also
reduces unwanted nondeterminism in queries.

Surprisingly, this has almost no impact on performance
benchmarks.  I expected it to cut run times in half for
BenchmarkAppend and BenchmarkNaiveReverse.

    True               10139 ns/op
    Append            297719 ns/op
    UnifyDeep           7523 ns/op
    UnifyDeepFail        959 ns/op
    UnificationHash     9776 ns/op
    Maplist           923803 ns/op
    NaiveReverse   117587650 ns/op
    Read              109328 ns/op

I'll need to poke around in some profiling data to see what's
holding up the show.

Closes #7