Specializations now get their own schedules

and bounds inference understands the IfThenElses produced,
which means you can finally write fallback schedules for small inputs.

Part of this required wrapping the Schedule class behind a
reference-counted handle, so there's a lot of trivial code changes.

This also required many new simplification rules to keep the resulting
logical operators sane. Previously we never really generated big trees
of ands and ors.
Allow malloc to return NULL when the size is zero.
Bugfix in IREquality resulted in IfThenElse nodes never equalling