Explain why we are strict about our identifiers
Allow underscores and :: in C++ type names

We should allow any C++ type name allowed in the language itself
Fix unit test for lack of concrete specifier

It was using the old form for empty classes which is no longer
supported. This means it would have failed regardless if the concrete
specifier was present or not
Remove "internal" specifier from datum

"datum" isn't actually internal as it's exposed to Scheme as
<datum-cell>. This causes us to generate a useless lliby_is_datum
runtime function but that's harmless as long as it's not exposed to
Scheme.
Add CellClassNames.schemeName

This is the Scheme-type name, i.e. StringLike => <string-like-cell>

At the same time make the other members lazy vals because not all names
might not be referenced for all cell classes. For instance, internal
classes will not have their Scheme name referenced because they're not
accessible from Scheme.
Add SourceBuilder.blockSep

Previously SourceBuilder.block would always emit a separator once the
block completes. This isn't always wanted, for example when building an
if-else. Make SourceBuilder.block not emit a separator and introduce
SourceBuilder.blockSep which is shorthand for block followed by sep()
Add generation of IntrinsicCellTypes.scala

This adds support for generating Scala source code and implements
IntrinsicCellTypes.scala writing on top of that