halve crafting tree generation costs in most cases

by assuming ingredients will be available, and only deailing with the
missing onces.

also changed getRoutersInterestedIn to return a generic collection -
most of the cost of that function is adding to a set, we might be able
to change this to a different approach in a later commit.