setup.py for possible packaging