fix int_validator

`int_validator` is currently broken in at least three cases:

1. accepts long integers as strings, returning the long value, but an actual long passed raises Invalid
2. floating point values raise Invalid even when int(value) == value
3. when passed an empty string it returns None, but when passed None it raises Invalid

Tests to come