HeteroCL: A Multi-Paradigm Programming Infrastructure for Software-Defined Reconfigurable Computing