Issue title: [LMLayer] Enhanced Levenshtein-like algorithm for predictive corrections
 Issue body: **Is your feature request related to a problem? Please describe.**
At present, communication between KMW and the LMLayer only provide limited corrective ability - only variations based on the last keystroke are considered for correction.

**Describe the solution you'd like**
It would be better if we can have keystroke-based correction that considers the keystroke input that generated the current context.  Swapping out keystrokes (and applying their underlying keyboard rules) would provide a much more natural predictive experience.

Of course, wisdom in implementation is necessary; keyboard rules can permit a wide, wide range of variation in outputs and the resulting time complexity of a complete, exact algorithm is likely to be computationally expensive if not restrained or scope-limited in some manner.

**Existing work**
#1869 features work that could be used to support such an algorithm, though said work is in need of further refinement.  The algorithm itself was never completed, as it was necessary to cut its development for 12.0's release.
 Comments: 
 Comment 0: Enough enhancements are in place to consider this fulfilled for now.  Sure, more improvements may be possible in the future... but that's much further down the roadmap.
{'source': 'GithubIssues', 'repo_name_with_owner': 'keymanapp/keyman', 'issue_id': 509799928, 'repo_stars': 248.0}