Fixed a couple bugs in the sparse vector copy methods.
Split new modules lenskit-data-structures and lenskit-api out of lenskit-core to contain interesting data structures we use. The main purpose of the API abstraction is to make the core recommendation API in a separate module so that re-implementing it on top of another framework such as Mahout does not pull in all of LensKit. It will also provide us a good layer at which to make API stability guarantees.
This resulted in some additional class moves:
Moved sorted array sets, scored lists, and interval lists into the o.g.l.collections package.
Renamed o.g.l.data.vector to o.g.l.vectors and moved the UserVector and ItemVector classes into o.g.l.data.history.
Pushed DAO-based open method from RecommenderEngine to LenskitRecommenderEngine, as the API layer knows nothing about DAOs.
Pushed getDataAccessObject()>> from <<<Recommender down to LenskitRecommender.
Moved UserHistory and Event interfaces into o.g.l.data in the lenskit-api packages. The implementations remain in lenskit-core in their respective .history and .event packages.
Moved SortOrder into the DAO package.
Moved Index and Indexer to o.g.l.util.
Moved abstract classes, Lenskit* classes, and Builder from o.g.lenskit to o.g.lenskit.core, so only lenskit-api provides classes directly in org.grouplens.lenskit.
Moved cursors from GL Common into lenskit-data-structures in the new package org.grouplens.lenskit.cursors.