Pass unsended items to the logic.
functions don't need *linked*lists

these lists are only iterated, sot edited, so they do not need to be *linked* lists

List is an interface, 
where appropriate, linked lists are still instantiated, because LLists are a very good choice when all you want to do is quickly add an unknown number of items and iterate them.
(an ArrayList would be better if we could "guess" how many elements would be needed - adding to a pre-init'd arrayList is about 4x faster).

this PR causes no runtime changes, but means that any further optimisations which produce different list types don't need another pr.
Fix supplier pipe stop working.
Fix linked lists.
Fix it the other way around.
Don't copy here.
Fix pipe cache for lost SMP items

every time a pipe is saved, clear the routers pipe cache.
also, store the pipe in a weak reference, so that if it goes out of
scope for some reason, the router starts returning null.
use better concurrent types

changed to using concurrent types, added a single sortable key type,
used a sorted set, and avoided nasty, nasty item-wise searching of a
container for an item.

finally, using concurrent objects means that no locks are needed.