[PATCH 15/15] new slices support

Slices used to be a library-defined type, with no particular support from
the compiler.

Slices are now builtin types, with special support and semantics. Slices
are now seen as a kind of reference. The unification algorithm allows
for certain transparent conversions between slices.

We could allow references to transparently convert to slices of length
1. In any case, this is an operation that must be supported, whether
it is automagic or not.

There is no support for dyn slices yet. A dyn slice is an area of memory
whose elements have the same concrete type (but it's dynamically
unknown), have an identical size (but only known dynamically through fun
`any.sizeof) and who share the same vtable that is stored once in the
dyn slice object.

This patch also introduces the operator_at and operator_sub syntax, as
well as the range (and bounds) syntax.

Note: index_bounds and index_range are kept as separate types as:
bounds refer to a particular container (v.[2..] means "until the end of
container v") whereas a given range can be more logically used on
a different container (a set of bounds used on a different container can
yield a range of different size, for instance). In other words, with
index_bounds, 'count' is only defined for a given container. We couldn't
have index_range behave like this in general.
Newline escapes are moved to the next line for more precise control

Instead of
	let x = foo \
	bar

We want to make it possible to differentiate between:

	let x = foo
	\bar
	let x = foo
	\ bar

As spaces are sometimes more significant than usual in N, it makes sense
to move the escape character to the next line. And we've always
advocated for operators to be on the next line when breaking up a long
expression.

It's a little similar to the practice in some programming languages that
don't allow a trailing comma of placing the comma in a list at the
beginning of the next line (to facilitate the appending of new entries).
bootstrap: step_gather_final_instantiations: handle interdependent tentative instances
bootstrap:lexer: operators[]: encode it with structs
bootstrap:common: CONST_CAST: remove type argument

Uses __builtin_choose_expr with explicit mapping of 'const type -> type'
for needed types. Helps keep track of how often CONST_CAST() gets used.
lib/nlang: say and pr dropped the 'err' argument
bootstrap:types: rename _FILTER_ to _FILTEROUT_ as it was confusing
bootstrap:instantiate: separate instantiation code into new file
bootstrap:phi: split variable lifetime tracking code in a new file
bootstrap: inference: split type inference code to a new file
bootstrap: nodes: split generic node handling code from parser code

(Finally.)