Fix not_implemented() macro

not_reached() is not appropriate to use in cases where the code may actually be reached due to a developer error, since it does not emit an abort, rather it signals to the compiler that optimisations may be made assuming the code is never reached, such as omitting RET instructions.