Use the effective date found in the text if not present in the API

Generally, we rely on the effective dates provided by the FR, but their parser isn't always accurate. We used to do effective date parsing (from the XML) ourselves, though, so I just found that code in our history and tweaked it a bit.

This all gets triggered only when the effective date from the FR API is empty.

Unrelated: Also modifies tree compilation to account for appendices like M1, M2.