stack.h changes

Changed the push and pop functions to return the pointer to top element
When we moved top element out of this file and let the calling source
file create their own top pointers, we should have done it back then.
Earlier, as the top pointer was local to stack.h, we did not need to
return it.

free_st()
Added a new function to free the stack.

movetop_st()
Added a new function to move the top pointer to the next element in the
stack. This can be relacement for pop function, as explained next.

Pop function is currently broken
We are doing a memcpy to return the data element in a mempry location
allocated and passed on by a calling function, as an input parameter
Problem is that stack.h does not care about the structure of data
being stored. It just stores void pointers to that data. The length
of a void pointer is 8 bytes and does not copy f the whole of data to
the memory location passed by the caller.
1. The way out is to decommission this function, as any caller can simply
do top->data and cast the resulting (void *) to a pointer of appropriate
structure. Subsequently, it can call movetop_st() to move the top
pointer. This arrangement can also make the top_st() function redundant,
as now the user can simply do top->data. So, top_st() relegates to being
a accessor function, and I do not know how to do any data encapsulation
in C.
The cons of this simple solution is that I need to re factor lot of code
that uses this function in other source files :(
2. The other approach should be to make the caller some how pass the
structure information to this function. Hence, pop can do a correct
memcpy. But why go through all that hassle, as we don't hav data
encapsulation.