Improve UndefinedFunctionError

* Detect undefined errors for compiling modules
* Log undefined errors in Task's like other OTP processes
* Normalize undefined errors from OTP processes

It would be nice to add tests for the last two bullet points but wanted to check this is an acceptable approach first.
It is just being explicit (in comparison to the other two suffixes). I added the message just because of how OTP processes switch the `:undef` for `:"function not exported"`. Perhaps it is the cond clauses in the `reason: nil` section that are redundant?

I will fix the build and add a couple of tests which show should the difference better.