Split JIT into multiple classes

This is a VERY large commit... I changed so much stuff that it
seemed pointless to split this into multiple parts.

There now can exist multiple backends (but there is only asmjit
backend at the moment, I've been thinking of adding something
like LLVM-based backend) and the user is able to swith between
them via the JIT_BACKEND environment variable.

Unofortunately instruction lookup (searching native code by its
AMX address) has become slower (from O(1) to O(n)) but it is
possible to implement binary search (which is O(logn)).

I also had a thought about making the code position independent
so it would be possible to copy it around and CompilerOutput
would become unnecessary but that seems like a lot of work.