handle structures with 100,000 or more atoms

- the pdb format requires a 5-character field for the atom number; the
  hybrid-36 format allows up to a ridiculous number of atoms
optimize a number of functions

- Major optimization of the put_atom_in_box() function.
- Major optimization of the protein_precheck() function.
- Minor optimization in radial_volume_desolvation()
- Optimization in top_up() to scale for large structures.
Fix a number of crashes and special conditions

- Fix an issue where non-existing interactions were analyzed.

  Bug fix in setIonDeterminants(): skip interactions if either
  titratable_group_interaction_atoms or the backbone_interaction_atoms
  is empty.

- Set center of COO_group to self.atom if no oxygens present in residue.

  COO_group: If self.atom.get_bonded_elements('O') returns an emtpy list
  (the residue has missing side-chain), simply set the center of the
  group to the <self.atom> atom, instead of the center of the
  (non-existing) oxygens.

- Raise more friendly exception in Group.set_center() if an empty atom
  set is passed in.

- Cterm_group: Fix crash if residue is missing a carbon.

  The previous code would crash if the C-termini residue group was
  missing the carbon atom.

- Fix a failure when a HIS residue has missing side-chain atoms.

- Added an entry for Iodine (I) to the valence electrons table.
replace empty chains with "_" instead "A"