fix handling of experimental module compile flag (#56945)
Add a new `finish!` function which skips any inference/optimization and
just directly uses the (uninferred) source as the result, setting all
fields correctly assuming they might have come from a generated function
in the very unlikely case it set some of them, and making sure this is
now correctly synchronized with the cache lookup and insertion calls
once again.
This code feature was added without any tests in #37041, so I cannot
guarantee there aren't any mistakes still lurking here, either mine or
original.
Fixes #53431