I found what I believe is a relevant answer here, and I think it's relevant because of the following lines in your serial_server.py file:
#When it has been initialized, it'll start executing the following callback.
def executeCallback(self, goalHandle):
# <other code>
#Send a small Hello to Arduino.
arduino = serial.Serial(port=&...
I believe what you observe with the integral part is windup. You might fix that by limiting the overall value of the I part, or resetting it once the error is small or zeroes out or changes sign (zero crossing). All are known approaches dealing with windup (basically the integral keeps collecting until it saturates and then the system becomes unstable).