Adds a better non-adjacent optimizer.

* Makes code easier to understand by splitting simple and complex scenarios.
* Adds compatibility with upcoming new property optimizer.
Refactors the new, non-adjacent optimizer.

* Extracts common parts from simple & complex scenarios.
* Adds performance boost so its speed is comparable with the old one.
Readds minification feedback for non-adjacent optimizer.