Task: Fixes #4114 (rdkit/rdkit#4207)

org: rdkit
repo: rdkit
pr_number: 4207
issue_title: Fixes #4114
issue_body: This closes #4114 

Besides the bond properties, also EITHERDOUBLE Bond Dir was not being copied over to reaction products.

This enables copying bond properties and EITHERDOUBLE for reactant bonds that are not specified in the product template, or are specified in the product template as "Null Bond".

resolved_issues: number: 4114
title: Reactions don't propagate bond properties
body: I'm using a custom build of RDKit 2021.03 on Mac.

It looks like RDKit reactions don't preserve bond properties from the reactants. Is this intentional?


```
from rdkit import Chem
from rdkit.Chem import rdChemReactions

rxn = rdChemReactions.ReactionFromSmarts('[O:1]>>[N:1]')

mol = Chem.MolFromSmiles('CCO')

mol.GetAtomWithIdx(0).SetIntProp('demo', 1)
reactant_bond = mol.GetBondBetweenAtoms(0, 1)
reactant_bond.SetIntProp('demo', 1)

product_groups = rxn.RunReactants([mol])
product = product_groups[0][0]

mapping = {int(a.GetProp('react_atom_idx')): a.GetIdx() for a in product.GetAtoms()}
product_bond = product.GetBondBetweenAtoms(mapping[0], mapping[1])
print(product_bond.GetPropsAsDict())
```

This shows no properties on the bond, and only the mapping properties on the atoms.

Reference solution:
fix_patch: diff --git a/Code/GraphMol/ChemReactions/ReactionRunner.cpp b/Code/GraphMol/ChemReactions/ReactionRunner.cpp
index 72abd1f2a30..c7a09a8006e 100644
--- a/Code/GraphMol/ChemReactions/ReactionRunner.cpp
+++ b/Code/GraphMol/ChemReactions/ReactionRunner.cpp
@@ -718,8 +718,14 @@ void setReactantBondPropertiesToProduct(RWMOL_SPTR product,
     }
 
     pBond->setBondType(rBond->getBondType());
+    if (rBond->getBondType() == Bond::DOUBLE &&
+        rBond->getBondDir() == Bond::EITHERDOUBLE) {
+      pBond->setBondDir(Bond::EITHERDOUBLE);
+    }
+
     pBond->setIsAromatic(rBond->getIsAromatic());
 
+    pBond->updateProps(*rBond);
     if (pBond->hasProp(common_properties::NullBond)) {
       pBond->clearProp(common_properties::NullBond);
     }
@@ -858,6 +864,14 @@ void addMissingProductAtom(const Atom &reactAtom, unsigned reactNeighborIdx,
   } else {
     product->addBond(productIdx, prodNeighborIdx, origB->getBondType());
   }
+
+  auto prodB = product->getBondBetweenAtoms(prodNeighborIdx, productIdx);
+  if (origB->getBondType() == Bond::DOUBLE &&
+      origB->getBondDir() == Bond::EITHERDOUBLE) {
+    prodB->setBondDir(Bond::EITHERDOUBLE);
+  }
+  bool preserveExisting = true;
+  prodB->updateProps(*origB, preserveExisting);
 }
 
 void addReactantNeighborsToProduct(