BROKEN: change to cache providers

merged ExitRoute,SearchNode also; needed the distance metric for
abitrary nodes to sort the resulting providers.

-- current symptom: no request works. provider shows what is there, but
everything is beign filterd. (see breakpoint at requestManager:303
(check provider) when you have a chest, a provider pipe, a request pipe
and a wrench.
special case handling

routers are equal distance are not the same;

different networks will have null exitRoutes to each other, filter the
null's early.
caching for crafters, providers

caching should result in much faster crafting /providing requests
firewalls, extractors, qsorts don't take advantage of this, yet.
re-routing, and a few other things still running the full list; to be
fixed, but most of the cpu usage is now cached.

semi-final sink-check  (module.sinksItem()) now runs via itemIdentifer,
and routedItems store their ID allong with their item. -- this should
switch to use the cache soon.
handle damaged vs undamaged by returning routers interested in both, and letting them decide.

caching for providers,crafters,extractors and qsort is now complete
cache only updated once per tick, so items will take 1 tick to be
noticed, rather than the same tick :) ... such is the horible price of
caching ...
(actual deliveries/extracts are still done vs real inventories, so
nothing lost there)
Add check to getDistanceTo
Null check
Access first, check for null later, Whatever.
Fix supplier logic
And logisticsmanager
things other than Providers are passive sources

(also, basic pipes don't need to add themselves to both specific and
general intrestes when default routing)
chassi should handle ISpecial
still broken: various derp fixes .. should not write/commit code at 1am.

handle module sinking matching undamaged items.
modules which care about undamaged matching should declare an interest
in the undamaged varient of an item.
if they want do declare an interest in an undamaged varient of anything
in their attached inventory, interestedInUndamagedID() returning true is
the correct way to do that.

don't filter out firewalls from the matching list.
rename validDestinations to validSources
prevent out-of-bounds exception with threading enabled.
cache the old list in a set, not a list
and save before commiting ...
don't get the list 3 times and then copy it.
firewall still broken, other stuff works.

ISpecial untested, requesting, extracting fixed.

firewall correctly routes items, but everythign ariving at it gets the
wrong direction to the next stop, because it arives at the central
router, with a destination of the edge router. need to replace
destination when it arives at the firewall.
firewall shouldn't search all nodes

also, split to a new class, removing all isItemRelayed checks from the
base class
and use the right end of the route for crafting ....