More context chain refactoring.

Now like controllers we adopt a pattern where we create a "known safe instance" and use that.
This cuts out some of the cruft in the ApplyContext method and also lets us build an "instance chain."

The instance chain is used for runtime lookups of the context chain processing the request.
For e.g: FlashContext looks up the SessionContext in the instance chain, and uses that to fetch
a session instance.

(Previous attempt had the controller proxying this lookup which leads to lot of controller bloat.)

This should all be "type checked" at runtime by the TestContext() method; but that only applies if you're
using the built-in chain.