Provide c_ptr(type) and related functions for C integration

[Reviewed by Tom]

Before this patch, extern block C integration wraps C pointer types
with _ddata, and then does not provide a convenient way for
a Chapel user to create a C pointer to a Chapel object. This
patch fixes the problem in the following manner:
1) Rename c_ptr to c_void_ptr since I decided that c_ptr(type)
    and c_void_ptr are my favorite names for these things.
2) Allow FLAG_NO_WIDE_CLASS to be specified in a pragma
    since we'll use it in step 3.
3) Create c_ptr in SysBasic.chpl. c_ptr is similar to _ddata,
    except that a C pointer is always local. C pointers must
    always be local if we are to be able providing an arbitrary
    C data structure to a C function (e.g. what if we needed to
    pass a pointer to a pointer to int to a C function, which
    does a double-dereference? If c_ptr were wide, even though
    the extern call would only pass the local version for the
    outer pointer, the inner pointer would still be wide).
    Along with c_ptr, we add functions c_calloc, c_free, and
    c_ptrTo.
4) Modify the code generator in expr.cpp in order to correctly
    widen a reference produced by PRIM_ARRAY_GET when the
    result of PRIM_ARRAY_GET is not wide but it is stored in
    a wide reference.
5) Modify externCResolve.cpp to use c_void_ptr for void* and
    c_ptr instead of _ddata.
6) Add some tests showing this pointer behavior with extern blocks.



git-svn-id: http://svn.code.sf.net/p/chapel/code/trunk@21872 3a8e244f-b0f2-452b-bcba-4c88e055c3ca