### Godot version

v4.0.3.stable.mono.official [5222a99f5]

### System information

macOS Monterey 12.6.6 (21G646)

### Issue description

When creating a tileset by code with custom data layers, removing a layer with `remove_custom_data_layer` does not update the name-to-layer mapping; `get_custom_data_layer_by_name` will continue to return that layer's original index.

This has a downstream effect of causing TileData objects attempting to use `get_custom_data('Layer B')` to return invalid data (whatever custom data is now in Layer B's old index; e.g. Layer C).

I would expect that after using `remove_custom_data_layer`, I would be able to still use `get_custom_data_layer_by_name` on that tileset.

### Steps to reproduce

Run this code to see that getting Layer B by name after removing the first layer continues to return its original index (1) when in reality it is now at index 0.
```
	var tileset:TileSet = TileSet.new()

	tileset.add_custom_data_layer()
	tileset.set_custom_data_layer_name(0, 'Layer A')
	tileset.set_custom_data_layer_type(0, TYPE_INT)

	tileset.add_custom_data_layer()
	tileset.set_custom_data_layer_name(1, 'Layer B')
	tileset.set_custom_data_layer_type(1, TYPE_STRING)

	print('Layer index 0 name : ', tileset.get_custom_data_layer_name(0)) # Layer A
	print('Layer index 1 name : ', tileset.get_custom_data_layer_name(1)) # Layer B
	print('Layer B is on index : ', tileset.get_custom_data_layer_by_name("Layer B")) # 1

	print('----- removing custom data layer 0 -----')
	tileset.remove_custom_data_layer(0)

	print('Layer index 0 name : ', tileset.get_custom_data_layer_name(0)) # Layer B
	print('Layer index 1 name : ', tileset.get_custom_data_layer_name(1)) # prints an error, as expected
	print('Layer B is on index : ', tileset.get_custom_data_layer_by_name("Layer B")) # returns 1 still! should return 0.
```

### Minimal reproduction project

[RemoveCustomDataLayer.zip](https://github.com/godotengine/godot/files/11804762/RemoveCustomDataLayer.zip)

property_info = PropertyInfo(Variant::FLOAT, vformat("animation_frame_%d/duration", i), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR);
			if (!store_durations) {
				property_info.usage ^= PROPERTY_USAGE_STORAGE;
			}
			tile_property_list.push_back(property_info);
		}
		for (const KeyValue<int, TileData *> &E_alternative : E_tile.value.alternatives) {
			
			tile_property_list.push_back(PropertyInfo(Variant::INT, vformat("%d", E_alternative.key), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR));
			
			List<PropertyInfo> alternative_property_list;
			E_alternative.value->get_property_list(&alternative_property_list);
			for (PropertyInfo &alternative_property_info : alternative_property_list) {
				Variant default_value = ClassDB::class_get_default_property_value("TileData", alternative_property_info.name);
				Variant value = E_alternative.value->get(alternative_property_info.name);
				if (default_value.get_type() != Variant::NIL && bool(Variant::evaluate(Variant::OP_EQUAL, value, default_value))) {
					alternative_property_info.usage ^= PROPERTY_USAGE_STORAGE;
				}
				alternative_property_info.name = vformat("%s/%s", vformat("%d", E_alternative.key), alternative_property_info.name);
				tile_property_list.push_back(alternative_property_info);
			}
		}
		
		for (PropertyInfo &tile_property_info : tile_property_list) {
			tile_property_info.name = vformat("%s/%s", vformat("%d:%d", E_tile.key.x, E_tile.key.y), tile_property_info.name);
			p_list->push_back(tile_property_info);
		}
	}
}
void TileSetAtlasSource::create_tile(const Vector2i p_atlas_coords, const Vector2i p_size) {