Speed and architecture improvements to user-user CF

This refactors the user-user CF implementation to have a saner boundary between the scorer and neighborhood-finding code, and implement a working snapshotting neighbor finder.  Also makes some other improvements to evaluation.

It should be reviewed and merged after #565, since it depends on that code.