Constrained, Causal, and Knowledge-Grounded Reasoning for Neural Language Generation