Add psi_def header & source

A definition is any user-defined symbol like a constant, operator
or procedure. They exist within a psi_context. When parsing a file
or string, if a symbol is not found to be defined within that unit,
the parser will try to resolve that symbol within the context it is
being interpreted, e.g. Define (myproc x y) in file A, invoke it
(myproc 1 2) in file B.
psi.h: Include ctype.h header

We'll use methods for evaluating character "types" (e.g. alphanumerics,
punctuation, etc.)
psi_def: Add psi_isidvalid method

Also added a private method for determining if an individual
character can be in a valid identifier
Add def sanity test

Test out various valid (and invalid) identifiers.
test/def: Use macros to run valid/invalid cases

VALID_CASE ensures the identifier is valid.
INVALID_CASE ensures the identifier is invalid.
test/def: Add a few more test cases