Massive changes to block firing/output specs

Blocks now specify how their outputs relate to their inputs. Firing
rules and output independence are then calculated from those
specifications.