### Description

There are [2 labeling issues in Kibana when using Vector tiles](https://github.com/elastic/kibana/issues/130675).
1) Multiple labels for MultiPolygon and MultiLineString geometries.
    <img width="500" alt="Screen Shot 2022-04-20 at 9 32 26 AM" src="https://user-images.githubusercontent.com/373691/164268037-0d6088f3-5bd6-4e0e-9541-d551091af843.png">
2) Multiple labels for features that span tiles. For example, hexagons that span tile boundaries.
    <img width="500" alt="Screen Shot 2022-04-20 at 9 35 52 AM" src="https://user-images.githubusercontent.com/373691/164268658-dfdd6b0e-10b7-46da-a1e9-15e99044fc38.png">


The recommended solution is to provide features for labels, where the feature geometry is the label location.

To resolve these issues, I propose adding a new parameter, `withLabels`,  to `_mvt` API that when `true` would add label features to the response. Label features could be added in 2 ways
1) another layer, "label",  in the response. The "label" layer will contain Point feature for each hit and agg feature. For agg features, the Point feature will be the center of the hexagon. For hit features, the Point feature will be the centroid of the largest polygon for MultiPolygon and the centroid for the longest line for MultiLineString.
2) Include label feature in existing "hits" and "aggs" layers. Give label feature a property like "__EsIsLabelFeature" so filter expressions can be used exclude features in style rules.

Kibana is creating these centroid features today for GeoJSON sources. Kibana includes label features in GeoJSON feature collection and uses filters to exclude features in style rules (option 2 above) 

cc @jsanz @thomasneirynck 
x-pack/plugin/vector-tile/src/javaRestTest/java/org/elasticsearch/xpack/vectortile/VectorTileRestIT.java
if (tag.equals(thisTag)) {
                VectorTile.Tile.Value thisValue = layer.getValues(feature.getTags(i + 1));
                assertThat(value, Matchers.equalTo(thisValue.getSintValue()));
                return;
            }
        }
        fail("Could not find tag [" + tag + "]");
    }
    private void assertDoubleTag(VectorTile.Tile.Layer layer, VectorTile.Tile.Feature feature, String tag, double value) {
        for (int i = 0; i < feature.getTagsCount(); i += 2) {
            String thisTag = layer.getKeys(feature.getTags(i));
            if (tag.equals(thisTag)) {
                VectorTile.Tile.Value thisValue = layer.getValues(feature.getTags(i + 1));
                assertThat(value, Matchers.equalTo(thisValue.getDoubleValue()));
                return;
            }
        }
        fail("Could not find tag [" + tag + "]");
    }
    private void assertStringTag(VectorTile.Tile.Layer layer, VectorTile.Tile.Feature feature, String tag, String value) {
        for (int i = 0; i < feature.getTagsCount(); i += 2) {
            String thisTag = layer.getKeys(feature.getTags(i));
            if (tag.equals(thisTag)) {
                VectorTile.Tile.Value thisValue = layer.getValues(feature.getTags(i + 1));
                assertEquals(thisValue.getStringValue(), value);
                return;
            }
        }
        fail("Could not find tag [" + tag + "]");
    }