SkRasterPipeline: simplify impl and remove need to rewire stages

This builds the stages correctly wired from the get-go.  With a little clever
setup, we can also design around the previous error cases like having no stages
or pipelines that call st->next() off the end.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2149443002

Review-Url: https://codereview.chromium.org/2149443002
diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h
index 8ae7bb1..186ee65 100644
--- a/src/core/SkRasterPipeline.h
+++ b/src/core/SkRasterPipeline.h
@@ -96,9 +96,16 @@
 private:
     using Stages = SkSTArray<10, Stage, /*MEM_COPY=*/true>;
 
+    // This no-op default makes fBodyStart and fTailStart unconditionally safe to call,
+    // and is always the last stage's fNext as a sort of safety net to make sure even a
+    // buggy pipeline can't walk off its own end.
+    static void SK_VECTORCALL JustReturn(Stage*, size_t, Sk4f,Sk4f,Sk4f,Sk4f,
+                                                         Sk4f,Sk4f,Sk4f,Sk4f);
+
     Stages fBody,
            fTail;
-    bool   fReadyToRun = false;
+    Fn fBodyStart = &JustReturn,
+       fTailStart = &JustReturn;
 };
 
 #endif//SkRasterPipeline_DEFINED