Make ALWAYS_ASSERT work

ALWAYS_ASSERT didn't do anything, perhaps because various assertions were depending on debug mode being active, and would fail with a compile error if it was not.

* Removed all assignment expressions from assert() invocations. Some were accidental (equality was intended), some were accidentally nonfunctional due to shortcut evaluation (true || foo), and the rest were incompatible with ALWAYS_ASSERT.
* Introduced debug_assert() as a shortcut for an assert() which is only done in debug mode.
* Replaced a not_reached() call with a more informative assertion.