A (Context a) associates Text labels with values of type a.
Each Text label can correspond to multiple values of type a
The Context is used for type-checking when (a = Expr X)
The difference between a Context and a Data.Map.Map is that a Context
lets you have multiple ordered occurrences of the same key and you can
query for the nth occurrence of a given key.