Task: Fix/github6138 (rdkit/rdkit#6193)

org: rdkit
repo: rdkit
pr_number: 6193
issue_title: Fix/github6138
issue_body: Fixed #6138 

There are a few atom properties that are not pickled properly after ChemReaction::validate has been called.

These are 

 _QueryIsotope
 _QueryFormalCharge

and the like.

This ensures they are pickled if the reaction has been initialized.
resolved_issues: number: 6138
title: Round-tripping a reaction through pickle changes the outputs from RunReactants
body: **Describe the bug**

RDKit's reaction objects can be pickled/unpickled, but in some cases running the unpickled reaction can produce slightly different results than it did before the pickling. Interestingly, in my example it only happens if the reaction was ran at least once _before_ pickling, otherwise there are no issues.

**To Reproduce**
```python
import pickle
from rdkit import Chem
from rdkit.Chem import AllChem

mol = Chem.MolFromSmiles("COc1ccccc1Oc1nc(Nc2cc(C)[nH]n2)cc2ccccc12")
rxn = AllChem.ReactionFromSmarts("([c:1]:[n&H1&+0&D2:3]:[n:2])>>([c:1]:[n&H0&+0&D3:3](:[n:2])-C1-C-C-C-C-O-1)")

def run(r):
  return Chem.MolToSmiles(r.RunReactants((mol,))[0][0])

pickle.dump(rxn, open("tmp.pkl", "wb"))
rxn_reloaded = pickle.load(open("tmp.pkl", "rb"))

print(run(rxn))
print(run(rxn_reloaded))

pickle.dump(rxn, open("tmp_after.pkl", "wb"))
rxn_reloaded_after_use = pickle.load(open("tmp_after.pkl", "rb"))

print(run(rxn_reloaded_after_use))
```

Outputs:
```
COc1ccccc1Oc1nc(Nc2cc(C)n(C3CCCCO3)n2)cc2ccccc12
COc1ccccc1Oc1nc(Nc2cc(C)n(C3CCCCO3)n2)cc2ccccc12
COc1ccccc1Oc1nc(Nc2cc(C)[nH](C3CCCCO3)n2)cc2ccccc12
```

While the original SMILES can be correctly parsed by RDKit, the one obtained with the unpickled reaction can no longer be parsed.

**Expected behavior**

Result after round-tripping through pickle should be the same.

**Configuration (please complete the following information):**
 - RDKit version: 2021.09.4
 - OS: Ubuntu 16.04.6 LTS
 - Python version: 3.9.7
 - Are you using conda? Yes
 - If you are using conda, which channel did you install the rdkit from? conda-forge


Reference solution:
fix_patch: diff --git a/Code/GraphMol/ChemReactions/ReactionPickler.cpp b/Code/GraphMol/ChemReactions/ReactionPickler.cpp
index 9450fbebfc3..9a4822e43a6 100644
--- a/Code/GraphMol/ChemReactions/ReactionPickler.cpp
+++ b/Code/GraphMol/ChemReactions/ReactionPickler.cpp
@@ -146,15 +146,18 @@ void ReactionPickler::_pickle(const ChemicalReaction *rxn, std::ostream &ss,
   streamWrite(ss, BEGINREACTANTS);
   for (auto tmpl = rxn->beginReactantTemplates();
        tmpl != rxn->endReactantTemplates(); ++tmpl) {
-    MolPickler::pickleMol(tmpl->get(), ss);
+    auto props = rxn->df_needsInit ? PicklerOps::PropertyPickleOptions::NoProps :
+      PicklerOps::PropertyPickleOptions::AllProps;
+    MolPickler::pickleMol(tmpl->get(), ss, props);
   }
   streamWrite(ss, ENDREACTANTS);
 
   streamWrite(ss, BEGINPRODUCTS);
   for (auto tmpl = rxn->beginProductTemplates();
        tmpl != rxn->endProductTemplates(); ++tmpl) {
-    MolPickler::pickleMol(tmpl->get(), ss,
-                          PicklerOps::PropertyPickleOptions::AtomProps);
+    auto props = rxn->df_needsInit ? PicklerOps::PropertyPickleOptions::AtomProps :
+      PicklerOps::PropertyPickleOptions::AllProps;
+    MolPickler::pickleMol(tmpl->get(), ss, props);
   }
   streamWrite(ss, ENDPRODUCTS);
 
@@ -162,7 +165,8 @@ void ReactionPickler::_pickle(const ChemicalReaction *rxn, std::ostream &ss,
     streamWrite(ss, BEGINAGENTS);
     for (auto tmpl = rxn->beginAgentTemplates();
          tmpl != rxn->endAgentTemplates(); ++tmpl) {
-      MolPickler::pickleMol(tmpl->get(), ss);
+      // reagents don't have private properties set during initialization
+      MolPickler::pickleMol(tmpl->get(), ss, PicklerOps::PropertyPickleOptions::AtomProps);
     }
     streamWrite(ss, ENDAGENTS);
   }