An adaptive, finite difference solver for the nonlinear Poisson-Boltzmann equation with applications to biomolecular computations