Make TopNMetrics a little easier to build by writing an inheritable builder.

I factored how the TopNmetric builders work to use an inheritable, chainable builder (based around some strange type parameters) This makes the builder classes much smaller, a reasonable length to be put into the same file as the class it builds.

Also included in this comment, changes to make side channels returned from an item scorer pass through to the predictions made by the default item score algorithm. Added a neightborhood weight to the user-user predictions, Added a TopNPopularity metric for measuring the popularity of recommendations made by an algorithm.