Add ostream formatting for std::map
Make model::test_case not be a first-class entity

The model::test_case class exists to carry information about the details
of a test case but it should not be used as a "first-class" entity.
Doing so causes a lot of problems, if only because this requires a cyclic
dependency between model::test_program and model::test_case and this has
proven to be a huge annoyance over time.

The interface we want to expose to callers is the one of
model::test_program, and this class should hide the details of the test
cases behind an interface that is agnostic to the internal data types.

Start this refactoring by detaching model::test_case from its container
model::test_program.  There are still a lot of hacks left behind after
doing this that will be cleaned up later.
Make model::test_program immutable

Kill the set_test_cases hack that has haunted model::test_program since
the beginning of times (and that was made much worse with the
introduction of the model module).

Instead, add an ad-hoc lazy_test_program to the runner module that
implements the delayed loading of test cases.  The kyuafile module now
explicitly uses this class instead, as that is the only place where we
need lazy processing of test cases.

While doing this, introduce a new builder for this class to simplify
all affected tests.

I am not convinced this is the final design but the code is much nicer
than it was before and should be easier to maintain, particularly on
the tests side.