
Thoughts on mutual declarations
-------------------------------

When checking block of mutual declarations

    x1 : A1
    x1 = e1
    ...
    xn : An
    xn = en

you first check that (x1:A1)..(xn:An) is a well-formed context and then you
check that e1..en fits this context. Basically we decouple the types from the
definitions.

How can we extend this to datatypes and definitions by pattern matching? What
would the ei's be? An attempt:

data Declaration = ... | Definition Telescope [Definition]

data Definition = FunDef  DefInfo Name [Clause]
		| DataDef DefInfo [LamBinding] [Constructor]
				-- ^ domain-free bindings matching the telescope

I don't see a problem with this approach. Let's try it and see how far we get...

Untyped definitions doesn't fit this.. but they shouldn't appear in a mutual
anyway so let's make a special case for those:

data Declaration = ... | UntypedDefinition DefInfo Name Expr [Declaration]

