Task: Preserve bond type and order in all `Modeller` operations (openmm/openmm#4323)

org: openmm
repo: openmm
pr_number: 4323
issue_title: Preserve bond type and order in all `Modeller` operations
issue_body: This is not linked to an open issue (as far as I can tell), but it falls in the same category as #4112 (issue), #4113 (PR), completing the work of the latter. 

----

When generating a new topology for a `Modeller` as a result of any operation, bonds that had `type` and `order` attributes in the original topology should retain them, instead of implicitly setting them to `None`.

This PR

- ensures that  `delete()` (therefore implicitly `deleteWater()`), `addSolvent()`, `addHydrogens()` and `addExtraParticles()` behave in the desirable way, while #4112 did it for `add()` (and implicitly for `addMembrane()`).

- adds regression tests either as new tests method, or as assertions in existing test methods



resolved_issues: title: Preserve bond type and order in all `Modeller` operations
body: ### Issue Description

#### Problem:
When performing operations in the `Modeller` class, such as adding solvent, deleting water, adding hydrogens, or adding extra particles, bond attributes like `type` and `order` are not preserved in the resulting topology. This leads to the loss of critical bond information that may be essential for downstream processes, such as simulations or analyses that rely on accurate chemical representations.

#### Expected Behavior:
All operations in the `Modeller` class should preserve bond attributes, including `type` and `order`, from the original topology. When a new topology is generated as a result of these operations, bonds should retain their original attributes to ensure consistent and accurate molecular representations.

## IMPORTANT INSTRUCTIONS

1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory
2. If you edit a c++ file, you MUST run 'make -j4 && make install" inside the build directory

Reference solution:
fix_patch: diff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py
index 997e0f53b1..1cc5299fbe 100644
--- a/wrappers/python/openmm/app/modeller.py
+++ b/wrappers/python/openmm/app/modeller.py
@@ -178,7 +178,7 @@ def delete(self, toDelete):
         for bond in self.topology.bonds():
             if bond[0] in newAtoms and bond[1] in newAtoms:
                 if bond not in deleteSet and (bond[1], bond[0]) not in deleteSet:
-                    newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])
+                    newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)
         self.topology = newTopology
         self.positions = newPositions
 
@@ -253,7 +253,7 @@ def convertWater(self, model='tip3p'):
                         newPositions.append(deepcopy(self.positions[atom.index]))
         for bond in self.topology.bonds():
             if bond[0] in newAtoms and bond[1] in newAtoms:
-                newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])
+                newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)
         self.topology = newTopology
         self.positions = newPositions
 
@@ -549,7 +549,7 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p
                     newAtoms[atom] = newAtom
                     newPositions.append(deepcopy(self.positions[atom.index]))
         for bond in self.topology.bonds():
-            newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])
+            newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)
 
         # Sort the solute atoms into cells for fast lookup.
 
@@ -1000,7 +1000,7 @@ def isHbond(d, h, a):
                         newPositions.append(deepcopy(self.positions[atom.index]))
         for bond in self.topology.bonds():
             if bond[0] in newAtoms and bond[1] in newAtoms:
-                newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])
+                newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)
 
         # The hydrogens were added at random positions.  Now perform an energy minimization to fix them up.
 
@@ -1224,7 +1224,7 @@ def addExtraParticles(self, forcefield, ignoreExternalBonds=False, residueTempla
 
         for bond in self.topology.bonds():
             if bond[0] in newAtoms and bond[1] in newAtoms:
-                newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])
+                newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)
 
         if len(missingPositions) > 0:
             # There were particles whose position we couldn't identify before, since they were neither virtual sites nor Drude particles.