[OT] Port Arabic fallback shaping to synthetic GSUB

All of init/medi/fina/isol and rlig implemented.

Let there be dragons... ⻯
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index a19c8b2..1dd8b0a 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -360,10 +360,8 @@
 static inline void
 hb_ot_substitute_default (hb_ot_shape_context_t *c)
 {
-  if (c->plan->shaper->preprocess_text) {
-    hb_synthesize_glyph_classes (c); /* XXX This is a hack for now. */
+  if (c->plan->shaper->preprocess_text)
     c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
-  }
 
   hb_ot_mirror_chars (c);
 
@@ -393,8 +391,7 @@
   if (!hb_ot_layout_has_glyph_classes (c->face))
     hb_synthesize_glyph_classes (c);
 
-  if (hb_ot_layout_has_substitution (c->face))
-    c->plan->substitute (c->font, c->buffer);
+  c->plan->substitute (c->font, c->buffer);
 
   hb_ot_layout_substitute_finish (c->font, c->buffer);