Likely fix for erogenousbeef/BigReactors#95

On very slow world loads, empty controllers can be spawned due to slow
world ticks and processing of incoming blocks. We should be able to
absorb empty controllers anyway, and a null check fixes this.
Second fix for erogenousbeef/BigReactors#95

Two different fixes here.
One, we weren't checking for invalidated tile entities when adding parts
to machines. Obviously, if a TE isn't valid any longer, we shouldn't add
it to machines.

Two, we weren't unregistering TEs from the registry's lists when they
got invalidated without an attached controller. This could happen on
chunk unload or on very slow chunk loads on the client.
Change IMultiblockPart to an abstract class

This ensures we get the TileEntity methods we need and don't need to
re-expose them. Also prevents abstract-method errors in case someone
double-implements the interface.
Adding debug code to check for double-added parts
Temp-removing orphan check
Re-adding orphan check for cleaner rollbacks
Adding secondary part tracking hashmap

This should help identify when parts are double-added, and if they are
identical or different parts.

In the future, simply migrating to this "parts map" is probably
advisable.
Adding isInvalid checks, on the off chance this fixes race conditions
Removing world-registry checks - these are not valid cases

These will always hit during a same-frame remove-and-add, but
remove-and-add is a valid scenario due to villagers. (Because villagers
chunk-thrash on the server when their chunk is unloading.)
Adding stacktrace to severe connected-parts error
Change controllers to track part sets instead of coord sets

This is, really, more correct. It also prevents all problems with
double-added coordinates, I think.
Fix bad formatting string in warning message, which causes crashes
Add min/max updates on part added, just in case of weirdness
Stripping out debug code
Merging main > debug