further DSL tweak.

- the last codec error is now stored in the intermediate context,
  so the state machine can use a code like `ctx.err(..), S1(ctx)`.
- fixed a performance regression due to the decoder generalization.
  the decoder performance should be on par with hand-written one
  (less than 10% difference) with `--opt-level=3 -Z lto` rustc flags.