PORTB Interrupt On Change changes state unintentionally
You need to read PORTB before clearing the RBIF flag inside interrupt(), otherwise the mismatch will still exist and the RBIF flag won't be cleared.  See section 3.4.3 INTERRUPT-ON-CHANGE in the PIC's datasheet:


  For enabled interrupt-on-change pins, the present value is compared
  with the old value latched on the last read of PORTB to determine
  which bits have changed or mismatched the old value.