Currently, when an object is mapped with `subobjects: false`, trying to ingest a document that has nested objects leads to a mapping exception.

In a couple of occasions, we've been talking about that it would be convenient if Elasticsearch could automatically flatten the fields instead of the client having to know about the `subobjects` setting. This would make `subobjects: false` more of a drop-in replacement that allows for a much easier adoption, without changes in the client.

Note that the `_source` should ideally stay untouched, just the stored fields should be flattened automatically.

Some related issues
* https://github.com/elastic/apm/issues/347
* https://github.com/elastic/elasticsearch/issues/88777
* https://github.com/elastic/package-spec/issues/349
server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java
final RootDocumentParserContext context;
        final XContentType xContentType = source.getXContentType();
        
        DocumentParsingObserver documentParsingObserver = source.toBeReported()
            ? documentParsingObserverSupplier.get()
            : DocumentParsingObserver.EMPTY_INSTANCE;
        try (
            XContentParser parser = documentParsingObserver.wrapParser(
                XContentHelper.createParser(parserConfiguration, source.source(), xContentType)
            )
        ) {
            context = new RootDocumentParserContext(mappingLookup, mappingParserContext, source, parser);
            validateStart(context.parser());
            MetadataFieldMapper[] metadataFieldsMappers = mappingLookup.getMapping().getSortedMetadataMappers();
            internalParseDocument(metadataFieldsMappers, context);
            validateEnd(context.parser());
        } catch (XContentParseException e) {
            throw new DocumentParsingException(e.getLocation(), e.getMessage(), e);
        } catch (IOException e) {
            
            throw new DocumentParsingException(XContentLocation.UNKNOWN, "Error parsing document", e);
        }
        assert context.path.pathAsText("").isEmpty() : "found leftover path elements: " + context.path.pathAsText("");
        Mapping dynamicUpdate = createDynamicUpdate(context);
        
        if (dynamicUpdate == null) {
            documentParsingObserver.setIndexName(mappingParserContext.getIndexSettings().getIndex().getName());
            documentParsingObserver.close();
        }
        return new ParsedDocument(