Repository: rochacbruno/dynaconf (python)

Issue:
[bug] RuntimeError: dictionary changed size during iteration when using @del within dynaconf_merge logic
**Describe the bug**
The following [line](https://github.com/rochacbruno/dynaconf/blob/25fed5dc27d1dd78c368d7464f7d160b46aa1d24/dynaconf/utils/__init__.py#L49
) is bugged, changing dict size during iteration, via pop() leads to 

```
RuntimeError: dictionary changed size during iteration
```

**To Reproduce**
You can run following python code which is assumed to be very simple interpretation of the code line above:
```
new = {"a": 1}

for k, v in new.items():
    new.pop(k, None)
```

1. To reproduce it with `dynaconf`, use following config.yaml
```
default:
  options:
    A: 1
    B: 2
development:
  options:
    dynaconf_merge:
      B: "@del"
```

**Expected behavior**
No RuntimeError, key marked with `@del` is removed from merge result


Pull request description:
fix object_merge issue #285 with  meta value
PR recreated #286 to fix some styling issues before merging

fix #285 

Patch:
diff --git a/dynaconf/utils/__init__.py b/dynaconf/utils/__init__.py
index b53c55d..03fd061 100644
--- a/dynaconf/utils/__init__.py
+++ b/dynaconf/utils/__init__.py
@@ -40,7 +40,7 @@ def object_merge(old, new, unique=False):
                 object_merge(value, new[key])
 
         # Cleanup of MetaValues on New dict
-        for key, value in new.items():
+        for key, value in list(new.items()):
             if getattr(new[key], "dynaconf_reset", False):
                 # new Reset triggers cleanup of existing data
                 new[key] = new[key].value


Test patch:
diff --git a/tests/test_utils.py b/tests/test_utils.py
index a87ff5d..1abc3cd 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -165,6 +165,16 @@ def test_merge_existing_dict():
     assert new == {"host": "localhost", "port": 666, "user": "admin"}
 
 
+def test_merge_dict_with_meta_values():
+    existing = {"A": 1, "B": 2, "C": 3}
+    new = {
+        "B": parse_conf_data("@del", tomlfy=True),
+        "C": parse_conf_data("@reset 4", tomlfy=True),
+    }
+    object_merge(existing, new)
+    assert new == {"A": 1, "C": 4}
+
+
 def test_trimmed_split():
     # No sep
     assert trimmed_split("hello") == ["hello"]