### 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)

}
					}
				}
			}
		}
	}
	
	for (int terrain_set = 0; terrain_set < get_terrain_sets_count(); terrain_set++) {
		for (int terrain = 0; terrain < get_terrains_count(terrain_set); terrain++) {
			Ref<Image> image;
			image.instantiate();
			if (counts[terrain_set][terrain].count > 0) {
				
				Ref<Texture2D> texture = counts[terrain_set][terrain].texture;
				Rect2i region = counts[terrain_set][terrain].region;
				image->initialize_data(region.size.x, region.size.y, false, Image::FORMAT_RGBA8);
				image->blit_rect(texture->get_image(), region, Point2i());
				image->resize(p_size.x, p_size.y, Image::INTERPOLATE_NEAREST);
			} else {
				image->initialize_data(1, 1, false, Image::FORMAT_RGBA8);
				image->set_pixel(0, 0, get_terrain_color(terrain_set, terrain));
			}
			Ref<ImageTexture> icon = ImageTexture::create_from_image(image);
			icon->set_size_override(p_size);
			output.write[terrain_set].write[terrain] = icon;
		}
	}
	return output;
}
void TileSet::_source_changed() {