More work on streams.  Problem is definitely kernel launch overhead.

stream creation/destruction moved from ax_e_cuda to cuda_main so it
is only callled once.

Increased polynomial order to 64 and reduced the number of cg
interations by 10 to reduce the number of kernel calls, making
profiling easier.

ax_e_cuda supports blocking and streams: NUM_BLOCK_MAX sets the
number of elements that are coalesced, which reduces the number
of memcpys and gemms (slightly).  NUM_STREAM_MAX sets the number
of streams used to overlap blocks of elements.  The device buffer
size is increased by a factor of NUM_BLOCK_MAX * NUM_STREAM_MAX.

Blocking has moderately beneficial effects by increasing the size
of the leading GEMMs and reducing the number of memcpys.  Streams
are working but limited by kernel launch overhead.  The runtime
api can't keep up with the kernel submission, so the loop over
small gemms falls behind and the subsequent memcpys can't be
overlapped because the api doesn't know they exist yet.

The fix is to use batched gemm calls, which requires implementing
them in magma.  Working on it.