### Godot version

4.0 (c1128e911ccd6f1e8c35646df804d894652a58f1)

### System information

Arch Linux

### Issue description

Read-only dictionaries can still have new keys added. The value for the new key isn't set (it is kept `null`).

This is caused by `Dictionary::operator[]` not checking if the key exists when it is read only mode. Accessing a key in the underlying HashMap will create if it does not exist. The actual value isn't set because it only returns a dummy reference.

### Steps to reproduce

Run the following snippet:

```gdscript
var dict = {}
dict.make_read_only()
prints("dict", dict) # {}
dict.foo = "hi"
prints("dict", dict) # { "foo": <null> }
```

### Minimal reproduction project

[DictReadOnlyAddKey.zip](https://github.com/godotengine/godot/files/10943387/DictReadOnlyAddKey.zip)

CHECK(int(map["Hello"]) == 8);
	map["Hello"] = 9;
	CHECK(int(map[StringName("Hello")]) == 9);
	
	map[12345] = -5;
	CHECK(int(map[12345]) == -5);
	map[false] = 128;
	CHECK(int(map[false]) == 128);
	map[Vector2(10, 20)] = 30;
	CHECK(int(map[Vector2(10, 20)]) == 30);
	map[0] = 400;
	CHECK(int(map[0]) == 400);
	
	CHECK(int(map[false]) == 128);
}
TEST_CASE("[Dictionary] get_key_lists()") {
	Dictionary map;
	List<Variant> keys;
	List<Variant> *ptr = &keys;
	map.get_key_list(ptr);
	CHECK(keys.is_empty());
	map[1] = 3;
	map.get_key_list(ptr);
	CHECK(keys.size() == 1);
	CHECK(int(keys[0]) == 1);
	map[2] = 4;
	map.get_key_list(ptr);
	CHECK(keys.size() == 3);
}
TEST_CASE("[Dictionary] get_key_at_index()") {