Adds a better non-adjacent optimizer.

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

* Extracts common part from simple & complex scenarios.
* Adds performance enhancements.
Readds minification feedback for non-adjacent optimizer.